
paule22
Mitglieder-
Gesamte Inhalte
190 -
Benutzer seit
-
Letzter Besuch
Inhaltstyp
Profile
Forum
Downloads
Kalender
Blogs
Shop
Alle Inhalte von paule22
-
Gibt es Programme, die mein Bild vom PC mit aufnehmen?
paule22 antwortete auf Quarzius's Thema in Anwendungssoftware
Hallo, mal ne Frage hier: wie funktionierte eigentlich die Makroaufzeichnung unter Win 3.1 da gabs doch nen Tool/Programm, mit dem man eine Art Movie erstellen konnte, was man gerade angeklickt hat und welches Programm man geöffnet hatte ... -
Hallo, gibt es irgendein SQL-Befehl, mit dem ich eine *.DBF Datei Packen, sprich die gelöschten Datensätze total entfernen kann??? Habe nämlich festgestellt, das beim löschen von Datensätzen nur eine Löschmarke gesetzt wird, nicht aber der jeweilige Datensatz gelöscht wird.
-
warum kann folgender Code nicht richtig im C++ Builder compiliert werden??? Es tretten immer wieder Fehler auf, wenn ein File-Stream geöffnet werden soll auf //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <iostream.h> #include <istream.h> #include <fstream.h> #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { SIZE z; // hier, kann nicht compiliert werden ... ostream out("test",ios_base::in|ios_base::out); cout << "test"; GetTextExtentPoint32( GetDC(Edit1->Handle), Edit1->Text.c_str(), strlen(Edit1->Text.c_str()), &z); Label1->Caption = z.cx; Label2->Caption = z.cy; } //--------------------------------------------------------------------------- es kommt immer die Fehlermeldung: [C++ Error] Unit1.cpp(24): E2285 Could not find a match for 'ostream::basic_ostream(char *,int)'. [C++ Warning] Unit1.cpp(36): W8004 'out' is assigned a value that is never used.:confused: :confused: :confused: :confused:
-
würde mich auch mal interessieren, woher diese Funktion ihre Werte nimmt ... wenn ich GetText... unter verwendung von H verwende kommt bei mir x = 10 y = 16 raus. in der Win32-Help steht ... "The GetTextExtentPoint32 function uses the currently selected font to compute the dimensions of the string. The width and height, in logical units, are computed without considering any clipping." ändere ich aber den Font auf 8 oder 16 oder weis der Geier, bleiben immer noch die oben genannten Werte stehen. Sehr merkwürdige Funktion: ich verwende doch keinen anderen Code als ihr??? { SIZE z; ... GetTextExtentPoint32( GetDC(Edit1->Handle), Edit1->Text.c_str(), strlen(Edit1->Text.c_str()), &z); Label1->Caption = z.cx; Label2->Caption = z.cy; ... }
-
geht es nicht, wenn Du eine "versteckte" ListBox verwendest (als Behelf) in der alle Einträge gesammelt werden? Muß evtl. aktiviert sein und außerhalb des sichtbaren Bereichs sein. Evtl. mit TabSheets arbeiten um die Listbox zu verstecken
-
http://www.oreilly.de/catalog/msqlger/index.html
-
http://www.muenster.de/~m_frost/strukto.html http://wwwlehrer.rz.uni-karlsruhe.de/~za345/java/alg-bes.htm http://www-is.informatik.uni-oldenburg.de/~dibo/hamster/leseprobe/node6.html http://www.users.odn.de/~b1nbg/ProjektWEB/g2/cc.htm#
-
also hier gibts einen NASSI, allerdings unter der Programmiersprache Pascal. http://www.lernnetz-sh.de/kmLinux/doc/Pascal-Kurs/pas331.html und der PAP: http://www.lernnetz-sh.de/kmLinux/doc/Pascal-Kurs/pap.html
-
C++ Programmierung Grundlagen und fortgeschrittene Programmiertechniken Taschenbuch mit CD-ROM ISBN: 3-612-28158-5
-
weis ich schon, nur wie willste die Zeitgesteuert ablaufen lassen?
-
also wenn ich das richtig verstehe, willst Du eine Art Datenbank anlegen, in der alle Wörter aufgesammelt werden, die in irgendwelchen Dateien vorkommen. Ich hätte da einen etwas anderen Lösungsvorschlag. Warum legst Du nicht ganz einfach eine Datenbank an Files an. Für das Wort Hallo die Datei "\data\Hallo.fil" darin kommen alle Dateien die das Wörtchen Hallo beinhalten samt den Zeilennummern, in der das Wort vorkommt. Die Datei "Hallo.fil" könnte dann folgenden Aufbau haben: [Datei_A.txt] 1 2 3 4 [Datei_B.txt] 2 3 4 5 Du ließt dann die Datei aus und brauchst einfach durch eine kleine IF-Anweisung die Zeilennummer anfügen. Dafür musst Du aber eine Zwischendatei anlegen "\tmp\Hallo.fil" in der Du deine Daten abspeicherst. In "\data\Hallo.fil" werden die Daten gelesen und in "\tmp\Hallo.fil" gespeichert. Wenn Du die Änderungen gemacht hast brauchst Du nur noch die in "\tmp" stehende "Hallo.fil" Datei kopieren und fertig isses. Das ist vielleicht nicht die beste Lösung für Dein Problem (ich würde dies nämlich über Struct-Anweisungen machen) aber die wohl am nachvollziehbare Lösung. Gut, die schnellste isses auch nicht gerade aber für einen Anfänger-Programmierer woll nicht schlecht geeignet. Hier mal ein wenig Code zu den was ich gesagt habe: Die Datei Hallo.fil hat folgenden aufbau: [C:\Datei_A.TxT] 1 6 7 8 [C:\Datei_B.TxT] 1 10 33 20 Hier nun der Code: ----- #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv) { char buffer[500]; char datei[300]; char next[500]; bool eingefuegt = false; FILE *data, *tmp; data = fopen("hallo.fil","r"); tmp = fopen("hallo.tmp","w"); if (!data) { printf("Fehler beim â„¢ffnen von 'Hallo.fil'."); exit(1); } fseek(data,0,SEEK_SET); while (fgets(buffer,499,data) != NULL) { int len = strlen(buffer); while (--len >= 0) { if (buffer[len] == '\n') { buffer[len] = 0; continue; } if (buffer[len] == '\r') { buffer[len] = 0; continue; } } if (sscanf(buffer,"[%s]",&datei) == 1) { strcat(buffer,"\n"); fwrite(buffer,strlen(buffer),1,tmp); while(fgets(buffer,499,data) != NULL) { if (!strcmp(buffer,"\n")) continue; if (sscanf(buffer,"[%s]",&datei) == 1) { eingefuegt = false; break; } // ---------------------------------- // ab hier wird eine neue Zeilenummer // eingefÂgt ... // ---------------------------------- int zeilennr = atoi(buffer); int einfuegenr = 4; if (zeilennr > einfuegenr && eingefuegt == false) { char p[200]; sprintf(p,"%d\n",einfuegenr); fwrite(p,strlen(p),1,tmp); eingefuegt = true; fwrite(buffer,strlen(buffer),1,tmp); continue; } fwrite(buffer,strlen(buffer),1,tmp); continue; } } // Rest der Datei schreiben ... strcat(buffer,"\n"); fwrite(buffer,strlen(buffer),1,tmp); } fclose(data); fclose(tmp); system("copy hallo.tmp hallo.fil"); } ------ Die Datei Hallo.tmp müsste nach Aufruf des Programms folgenden Aufbau haben: [C:\Datei_A.TxT] 1 4 6 7 8 [C:\Datei_B.TxT] 1 10 33 20 Dieser Code dient nur als Demonstration was man so alles machen kann. Verfeinert werden muss er auf alle Fälle noch. good luck
-
wenn es ein Programm für MS-Dos werden sollte, würde ich folgendes tun: 1. Speicherresidentes Programm mit Timer-Funktion erstellen. 2. Das Programm schaut in eine Datei namens Para.Dat wo die Parameter der Datei reingeschrieben werden (von externen Programmen z.B.) 3. wird die Timer-Zeit erreicht, wird zuerst in die Datei Para.Dat geschaut und ein String zusammengebastelt. z.B. C:\ExecPrg.ExE Para1 Para2 ... usw. 4. wird das Programm mit "system()" gestartet. 5. anschließend (oder vor den starten des eigentlichen Programms) wird die Datei Para.Dat neu geschrieben bzw. geleert - siehr "fopen("Para.Dat","w")" good luck
-
lokale variablen können mit Blöcken verschieden-viel wiederholt werden, wobei jede Variable nur im jeweiligen eingelschlossenen { } -Block gültig ist. int main(int argc,char**argv) { int a = 1; { int a = 2; { int a = 3 // und so weiter ] } }
-
// This library allows to make arrays on disk. #include <stdio.h> #include <string.h> #include <stdlib.h> template <class T> class disk_arr_line; template <class T> class disk_arr_element; template <class T> class disk_arr { private: FILE *memfile; char *file_name; const long xsize, ysize; const bool ftype; const bool rcheck; bool fstatus; T* zero_value; void range_error(long x, long y) const; friend class disk_arr_line<T>; friend class disk_arr_element<T>; public: disk_arr(char *, long, long, const T&, bool type=false, bool check=false); disk_arr(const disk_arr&); ~disk_arr(); bool operator!() const { return (!fstatus); } disk_arr_line<T> operator[](long x) { disk_arr_line<T> temp(x, this); return temp; } }; template <class T> disk_arr<T>::disk_arr(char *fname, long x, long y, const T& zero, bool type=false, bool check=false): xsize(x), ysize(y), ftype(type), rcheck(check) { zero_value = new T(zero); char* bytes; file_name = new char[strlen(fname)+1]; strcpy(file_name, fname); if (ftype) { memfile = fopen(fname, "r+b"); if (memfile) { fstatus = true; return; } } memfile = fopen(fname, "w+b"); if (!memfile) { fstatus = false; return; } fstatus = true; bytes=(char*)zero_value; for(long c1=0; c1<(xsize*ysize); c1++) for(int c2=0; c2<sizeof(T); c2++) fprintf(memfile, "%c", bytes[c2]); return; } template <class T> disk_arr<T>::disk_arr(const disk_arr& a): xsize(0), ysize(0), ftype(a.ftype), rcheck(0) { printf("\a\aError: disk_arr objects cannot be copied, \r\n"); printf("passed to function by value or returned from\r\n"); printf("function by value. \r\n"); printf("Other words: copy constructor can't be called.\r\n"); fclose(memfile); abort(); } template <class T> disk_arr<T>::~disk_arr() { fclose(memfile); if (!ftype) remove(file_name); delete []file_name; delete zero_value; return; } template <class T> void disk_arr<T>::range_error(long x, long y) const { fprintf(stderr, "Range check error in file %s,\r\n", file_name); fprintf(stderr, "X=%li, Y=%li, maxX=%li, maxY=%li.\r\n",x, y, xsize-1, ysize-1); abort(); } template <class T> class disk_arr_line { private: const long x; disk_arr<T>* a; disk_arr_line(long x1, disk_arr<T>* a1): x(x1), a(a1) {} friend class disk_arr<T>; public: disk_arr_element<T> operator[](long y) { disk_arr_element<T> temp(x, y, a); return temp; } }; template <class T> class disk_arr_element { private: const long x; const long y; disk_arr<T>* a; disk_arr_element(long x1, long y1, disk_arr<T>* a1): x(x1), y(y1), a(a1) {} friend disk_arr_line<T>; public: disk_arr_element<T> operator= (const T& r); disk_arr_element<T> operator= (disk_arr_element<T> el) { return (operator=(T(el))); } operator T() const; }; template <class T> disk_arr_element<T> disk_arr_element<T>::operator=(const T& r) { char* bytes; if ((x>=a->xsize)||(x<0)||(y<0)||(y>=a->ysize)) if(a->rcheck==true) a->range_error(x, y); else return (*this); fseek(a->memfile, sizeof(T)*(a->ysize*x+y), 0); bytes=(char*)&r; for(unsigned int c2=0; c2<sizeof(T); c2++) fprintf(a->memfile, "%c", bytes[c2]); return (*this); } template <class T> disk_arr_element<T>::operator T() const { if ((x>=a->xsize)||(x<0)||(y<0)||(y>=a->ysize)) if(a->rcheck==true) a->range_error(x, y); else return *(a->zero_value); char* bytes; T* r; r = new T; bytes=(char*)r; fseek(a->memfile, sizeof(T)*(a->ysize*x+y), 0); for(unsigned int c2=0; c2<sizeof(T); c2++) fscanf(a->memfile, "%c", &bytes[c2]); delete r; return (*r); } ------------------------------------------------------------------------- #include <iostream.h> #include "disk_arr.h" disk_arr<int> a("c:\\disk_arr1.tmp",10L,10L, 7, false, true); main() { int b; ios::sync_with_stdio; // Here I put it because disk_arr.h use stdio.h // for file input/output, but I am using iosteam.h // This line synchronize this two I/O libraries if(!a) return 0; // Check that file is opened good, if not - exit. cout << "This example checks disk_arr library" << endl; a[1][6] = 6; b = a[2][8]; a[2][9] = b + a[1][6]; a[9][0] = a[1][6]; a[5][5] = a[9][0] + a[2][9]*b - b*b; int sum=0; for(long x=0; x<10; x++) for(long y=0; y<10; y++) sum = sum + a[x][y]; cout << "Value below should be 745 if library works correctly" << endl; cout << "Value = " << sum << endl; return 0; } good luck ...
-
Moin, einfacher ginge das ganze in etwa so: char puffer[200]; sprintf(puffer,"Message: %s",var_text); ShowMessage(puffer);
-
also ich bin beim lernen mit der Hilfe vollkommen und ausreichend zurecht gekommen.
-
ich bin schon am verzweifeln ...
-
der code dazu schaut in etwa wie folgt aus ... int handle_procedure(void) { TStringList *local_variables = new TStringList(); AnsiString saved_token; static int if_rec = 0; int rec = 0; for (; { next_token: int code = get_token(); switch (code) { case DT_FORM: { switch (lex()) { case POINT_TOKEN: { if (handle_formstatement() == RET_FAIL) return RET_FAIL; } break; default: return fatal("Hier wird ein Punkt (.) erwartet."); break; } } break; case DT_PRINT: { dt_printgoto: AnsiString output_string; for (; { switch (lex()) { case ENDFILE: { dt_printeof: return fatal("Ende der Datei erreicht. Zeile nicht korrekt abgeschlossen."); } break; case '+': { switch (lex()) { case ENDFILE: goto dt_printeof; break; case IDENTIFIER: goto dt_printid ; break; case '\"': goto dt_printgf ; break; default: { return fatal("Ausdruck erwartet. Zeile nicht korrekt abgeschlossen."); } break; } } break; case IDENTIFIER: { dt_printid: if (can_exec && !if_stmt) { AnsiString str; str = "procedure_local_"; str += strlwr(token_buffer.c_str()); if (!(var_ptr = get_variable(str.c_str()))) return fatal("LOCAL Variable nicht definiert/bekannt."); if (var_ptr->type == VARTYPE_VALUE ) { output_string += FloatToStr(var_ptr->var_value) ; } else if (var_ptr->type == VARTYPE_STRING) { output_string += var_ptr->var_string; } } } break; case '\"': { dt_printgf: char *puffer = new char[2048*2]; int pos = 0; int c; while ((c = fgetc(input_file)) != '"') { if (c == EOF) return fatal("Ende der Datei erreicht."); if (c == '\n') return fatal("Textstring wurde nicht richtig abgeschlossen."); else { if (pos > (2048*2)-1) return fatal("Stringpuffer ist voll."); puffer[pos++] = c; } puffer[pos] = '\0'; } output_string += puffer; } break; case ';': goto dt_printend; break; default: { return fatal("Zeile muss mit einen Semikolon ( enden."); } break; } } dt_printend: if (can_exec && !if_stmt) output_form->Memo1->Lines->Add(output_string); } break; case DT_ENDIF: { AnsiString str; str = "endif: "; str += if_rec; ShowMessage(str); if (!if_rec) return fatal("ENDIF ohne IF-Bedingung nicht erlaubt."); if_rec--; if (rec) { rec = 0; if (!if_rec) if_stmt = 0; ShowMessage("endifENDIF"); return RET_OK; } if (!if_rec) if_stmt = 0; if (can_exec) return RET_OK; } break; case DT_IF: { if_rec++; switch (get_token()) { case DT_USERDEF: { saved_token = strlwr(token_buffer.c_str()); if (can_exec && !if_stmt) { AnsiString str; str = "procedure_local_"; str += saved_token; if (!(var_ptr = get_variable(str.c_str()))) return fatal("IF-Variable ist nicht definiert/bekannt."); // ------------------------ // IF <variable> = EXPR ... // ------------------------ if (var_ptr->type == VARTYPE_VALUE) { double wert1 = var_ptr->var_value; int code = lex(); if (code == EQUALSIGN) { double wert2 = handle_expr(EP_NORMAL); if (ptr__error) { ptr__error = 0; return RET_FAIL; } ptr__error = 0; if (wert1 == wert2) { ShowMessage("wert ist gleich"); can_exec = 1; if_stmt = 0; if (handle_procedure() == RET_FAIL) return RET_FAIL; } else { can_exec = 1; if_stmt = 1; if (handle_procedure() == RET_FAIL) return RET_FAIL; } if (handle_procedure() == RET_FAIL) return RET_FAIL; } else if (code == '>') { double wert2 = handle_expr(EP_NORMAL); if (ptr__error) { ptr__error = 0; return RET_FAIL; } ptr__error = 0; if (wert1 > wert2) { ShowMessage("wert ist gr”áer"); can_exec = 1; if (handle_procedure() == RET_FAIL) return RET_FAIL; ShowMessage("reci RETURN-IF"); } else { can_exec = 0; if (handle_procedure() == RET_FAIL) return RET_FAIL; } } else if (code == '<') { double wert2 = handle_expr(EP_NORMAL); if (ptr__error) { ptr__error = 0; return RET_FAIL; } ptr__error = 0; if (wert1 < wert2) { ShowMessage("wert ist kleiner"); can_exec = 1; } else { can_exec = 0; } } } // -------------------------- // IF <variable> = STRING ... // -------------------------- else if (var_ptr->type == VARTYPE_STRING) { AnsiString str1; str1 = var_ptr->var_string; int code = lex(); if (code == EQUALSIGN) { } } else return fatal("Typ der Variablen kann nicht bestimmt werden."); } // ------------------ else { int c; int code = lex(); if (code != EQUALSIGN) return fatal("Gleichheitszeichen (=) hier erwartet."); c = skip_white_space(); if (c >= '0' && c <= '9') { ungetc(c,input_file); double wert = handle_expr(EP_NORMAL); if (ptr__error) { ptr__error = 0; return RET_FAIL; } ptr__error = 0; if (can_exec) { ShowMessage("DDD"); ShowMessage(saved_token); ShowMessage(wert); rec = 1; goto next_token; } } else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_') { ungetc(c,input_file); get_token(); } } } break; default: { return fatal("reservierte SchlÂsselw”rter dÂrfen hier nicht verwendet werden."); } break; } } break; ... }
-
Hallo ich glaub du hast die Frage falsch verstanden? Ich baue gerade einen eigenen Compiler in der der Ausdruck IF expr = wert IF expr2 = wert2 ENDIF ENDIF vorkommt. IF und ENDIF werden als token ausgelesen. expr als Expression/Variable behandelt, wert gibt den Bedingungswert wieder. Leider ist es mir bis dato nicht gelungen einen vernüftigen IF-Handler-Procedure zu schreiben. Müsste doch das einfachste der Welt sein ?????? Also weiter Vielen Dank für Hilfe ....
-
Hallo Programmers, mal wieder ne doofe Frage: Wie kann ich eine IF-Schleife programmieren. (SourceCode wäre sinnvoll). Zum Inhalt: in einer Datei lese ich Zeichen für Zeichen aus und setze die ausgelesenen Zeichen zu token zusammen. Nun kommt folgender Ausdruck: if wert = 4; if wert_zaehler = 5; ? "richtig."; endif if wert = 3; ? "r2"; endif ? "Wert beträgt drei (3) -> " + wert; endif Vielen Dank für Hilfe.
-
Moin, .parsed.txt ist der übeltäter. wenn du sowas wie strcpy(filestr,argv[1]); strcat(filestr,".ptx"); sollte es klappen.
-
Halle Crush, ich habe nun die Funktion optimiert, sodass sie nun den Ausdruck width = 200+20+(((15-5)-(10*2))-5); aber der Ausdruck bringt einen Fehler in der Berechnung: width = 200+20+(((15-5)-2-(10*2))-5); Vermutlich weil bei der Berechnung des Ausdrucks immer zwei paare zusammen sein müssen, wäre dankbar für (ab)Hilfe des Problems ... kann man den Code so nehmen? ist der rekursiv programmiert? hier der Code für 'handle_expr()' ----------- double stack_value[2048]; int result_stack[2048]; int ptr__value = 0; int ptr__error = 0; static int ptr__lr = LR_PLUS; double handle_expr(void) { char buffer[100]; int lr = LR_PLUS; int code, r3; static int pos = 0; static int klammer = 0; static int num = 0; static int n = 0; double result; for (; { code = lex(); switch (code) { case '(': { klammer++; ptr__value = 0; double result = handle_expr(); stack_value[n] = result; #ifdef DEBUG AnsiString str; str = "result = "; str += IntToStr(ptr__value); str += " / "; if (n-1 < 0) str += FloatToStr((int)stack_value[n]); else str += FloatToStr((int)stack_value[n-1]); ShowMessage(str); #endif } break; case ')': { klammer--; return stack_value[n]; } break; case '-': { if (!pos) { ptr__lr = LR_MINUS; continue; } else { result_stack[n] = ptr__lr; stack_value [n] = token_value; ptr__lr = LR_MINUS; num = 0; continue; } } break; case '+': { if (!pos) { ptr__error++; ptr__value = 0; pos = 0; fatal("[+] nur Minus-Operator hier erlaubt."); return 0; } else { result_stack[n] = ptr__lr; stack_value [n] = token_value; ptr__lr = LR_PLUS; num = 0; continue; } } break; case '/': { if (!pos) { ptr__error++; ptr__value = 0; pos = 0; fatal("[/] nur Minus-Operator hier erlaubt."); return 0; } else { result_stack[n] = ptr__lr; stack_value [n] = token_value; ptr__lr = LR_DIV; num = 0; continue; } } break; case '*': { if (!pos) { ptr__error++; ptr__value = 0; pos = 0; fatal("[*] nur Minus-Operator hier erlaubt."); return 0; } else { result_stack[n] = ptr__lr; stack_value [n] = token_value; ptr__lr = LR_MUL; num = 0; continue; } } break; case NUMBER: { switch (ptr__lr) { case LR_PLUS : stack_value[n] += (double) token_value; break; case LR_MINUS: stack_value[n] -= (double) token_value; break; case LR_MUL : stack_value[n] *= (double) token_value; break; case LR_DIV : stack_value[n] /= (double) token_value; break; } result_stack[n] = ptr__lr; stack_value[n] = token_value; pos++; num++; n++; if (klammer) { ShowMessage("in klammer"); } continue; } break; case ';': { result = 0; int c; // #ifdef DEBUG AnsiString str; for (c = 0; c < 20; c++) { str += "results = "; str += FloatToStr(stack_value[c]); str += " / "; str += IntToStr(result_stack[c]); str += "\n"; } ShowMessage(str); // #endif // -------------------------------------- // Handles/calculates the stacked values. // each math operation appear in a // stacked value ... // -------------------------------------- for (c = 0; c < EXPR_MAX; c++) { // --------- // +expr ... // --------- if (result_stack[c] == LR_PLUS) { int r1 = stack_value[c]; int r2 = stack_value[c+1]; if (result_stack[c+1] == LR_MUL) { int r3 = r1*r2; result += r3; c++; } else if (result_stack[c+1] == LR_DIV) { // ----------------------------- // Division durch 0 abfangen ... // ----------------------------- if (r2 == 0) { ptr__error++; fatal("Division durch Null nicht erlaubt."); return 0; } else r3 = r1/r2; result += r3; c++; } else if (result_stack[c+1] == LR_MINUS) { int r3 = r1-r2; result += r3; c++; } else { int r3 = r1+r2; result += r3; c++; } } // --------- // -expr ... // --------- else if (result_stack[c] == LR_MINUS) { int r1 = stack_value[c]; int r2 = stack_value[c+1]; if (result_stack[c+1] == LR_MUL) { int r3 = r1*r2; result -= r3; c++; } else if (result_stack[c+1] == LR_DIV) { // ----------------------------- // Division durch 0 abfangen ... // ----------------------------- if (r2 == 0) { ptr__error++; fatal("Division durch Null nicht erlaubt."); return 0; } else r3 = r1/r2; result -= r3; c++; } else if (result_stack[c+1] == LR_MINUS) { int r3 = r1-r2; result -= r3; c++; } else { result -= (r1+r2); c++; } } // --------- // *expr ... // --------- else if (result_stack[c] == LR_MUL) { int r1 = stack_value[c]; int r2 = stack_value[c+1]; if (result_stack[c+1] == LR_MUL) { int r3 = r1*r2; result *= r3; c++; } else if (result_stack[c+1] == LR_DIV) { // ----------------------------- // Division durch 0 abfangen ... // ----------------------------- if (r2 == 0) { ptr__error++; fatal("Division durch Null nicht erlaubt."); return 0; } else r3 = r1/r2; result *= r3; c++; } else if (result_stack[c+1] == LR_MINUS) { int r3 = r1-r2; result *= r3; c++; } else { result *= (r1+r2); c++; } } // --------- // /expr ... // --------- else if (result_stack[c] == LR_DIV) { int r1 = stack_value[c]; int r2 = stack_value[c+1]; if (result_stack[c+1] == LR_MUL) { int r3 = r1*r2; if (r3 == 0) { ptr__error++; fatal("Division durch Null nicht erlaubt."); return 0; } result /= r3; c++; } else if (result_stack[c+1] == LR_DIV) { // ----------------------------- // Division durch 0 abfangen ... // ----------------------------- if (r2 == 0) { ptr__error++; fatal("Division durch Null nicht erlaubt."); return 0; } else r3 = r1/r2; if (r3 == 0) { ptr__error++; fatal("Division durch Null nicht erlaubt."); return 0; } else { result /= r3; c++; } } else if (result_stack[c+1] == LR_MINUS) { int r3 = r1-r2; if (r3 == 0) { ptr__error++; fatal("Division durch Null nicht erlaubt."); return 0; } else { result /= r3; c++; } } else { // ----------------------------- // Division durch 0 abfangen ... // ----------------------------- if (r2 == 0) r3 = 0; else r3 = r1/r2; if (r3 == 0) { ptr__error++; fatal("Division durch Null nicht erlaubt."); return 0; } else { result /= r3; c++; } } } } // ------------------------------ // at end, clear the value stack- // set all value to null... // ------------------------------ for (c = 0; c < EXPR_MAX; c++) stack_value[c] = 0; klammer = 0; n = 0; num = 0; pos = 0; ptr__value = 0; ptr__error = 0; ptr__lr = LR_PLUS; return result; } break; default: { error_expr: ptr__error++; pos = 0; num = 0; ptr__value = 0; fatal("Nummerischer Ausdruck erforderlich.\nVermutlich Zeile nicht korrekt abgeschlossen."); return 0; } break; } } } ----- vielen Dank im vorraus und für deine Tips !!!
-
Moin, gibt es die UNIX tools Flex und Bison evtl. auch für Borland C++? Wen ja bitte gebt mir eine URL zum herunterladen dieser tools. DANKE schonmal im vorraus ...
-
Hallo programmers, ich habe hier ein kleines Problem: Wie kann ich den unten stehenden Code so erweitern, dass nummerische Ausdrücke wie dieser ausgewertet werden können: 1. Ausdruck: 200-50/2*3; 2. Ausdruck: 200-50/(2+3); zum Code: "token_value" ist eine INTeger Variable die aus einer Datei gephrast wird, lex() ist dafür zuständig. hier der Code: --------------------- int ptr__value = 0; int handle_expr(void) { char buffer[100]; int lr = LR_PLUS; int code; for (; { code = lex(); switch (code) { case '-': { lr = LR_MINUS; } break; case NUMBER: { switch (lr) { case LR_PLUS: ptr__value += token_value; break; case LR_MINUS: ptr__value -= token_value; break; case LR_MUL: ptr__value *= token_value; break; case LR_DIV: ptr__value /= token_value; break; } code = lex(); switch (code) { case ENDFILE: { return fatal("Ausdruck nicht korrekt beendet.\nDateiende erreicht."); } break; case ';': { goto ende; } break; case '-': lr = LR_MINUS; break; case '+': lr = LR_PLUS; break; case '*': lr = LR_MUL; break; case '/': lr = LR_DIV; break; default: { return fatal("Kein gÂltiger nummerischer Operator."); } break; } } break; case ';': { ende: AnsiString ptr_str; ptr_str = "Der Wert betr„gt: "; ptr_str += ptr__value; ShowMessage(ptr_str); ptr__value = 0; n = 0; return RET_OK; } break; default: return fatal("Zeile nicht korrekt abgeschlossen"); break; } } } -------- und hier der Code zu lex(): ------------ int skip_white_space(void) { char buffer[200]; register int c; register int inside; c = fgetc(input_file); for (; { int cplus_comment; switch © { case '/': c = fgetc(input_file); if (c >= '0' && c <= '9' || c == ' ' || c == '\n') { ungetc(c,input_file); return '/'; } else if (c != '*' && c != '/') { sprintf(buffer,"unerwartetes Zeichen `/%c' gefunden",c); return fatal(buffer); } cplus_comment = (c == '/'); c = fgetc(input_file); inside = 1; while (inside) { if (!cplus_comment && c == '*') { while (c == '*') c = fgetc(input_file); if (c == '/') { inside = 0; c = fgetc(input_file); } } else if (c == '\n') { line_no++; if (cplus_comment) inside = 0; c = fgetc(input_file); } else if (c == EOF) return fatal("Kommentarzeile wurde nicht richtig abgeschlossen."); else c = fgetc(input_file); } break; case '\n': line_no++; case ' ': case '\t': case '\f': c = fgetc(input_file); break; default: return ©; } } } int lex(void) { char buffer[5]; int pos = 0; int c; c = skip_white_space(); if (c==RET_FAIL) return RET_FAIL; switch © { case EOF: { return (ENDFILE); } break; case '.': return POINT_TOKEN; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '_': { sprintf(buffer,"%c",c); token_buffer = buffer; while (isalnum© || c == '_') { if (pos) { sprintf(buffer,"%c",c); token_buffer += buffer; } c = fgetc(input_file); pos++; } ungetc(c, input_file); return (IDENTIFIER); } break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { token_value = 0; while (isdigit©) { token_value = token_value*10 + c - '0'; c = fgetc(input_file); } ungetc(c, input_file); return (NUMBER); } break; case '=': { return EQUALSIGN; } break; case '-': { return '-'; } break; case '*': { return '*'; } break; case '/': { return '/'; } break; case ';': { return ';'; } break; case '(': { return '('; } break; case ')': { return ')'; } break; default: { return c; } } return ILLEGAL; } ------ so das wars, hoffe auf Hilfe, grosses DANKEschön schon mal im vorraus...
-
Hallo, gibt es irgendwie die Möglichkeit aus einer Access-Anwendung heraus die Tabellen in DBF-Datensatzformat zu speichern. D.h. Es soll ein externes Programm eingesetzt werden, das aus einer Access-Datenbank alle Stunde die Datensätze in einer DBF-Datei synchronisiert. Das ganze sollte dann in C/C++ gehalten werden. Für Informationen und Links zu diesen Thema bin ich allen sehr dankbar.