serielle schnitstelle zum x-ten mal!
-
Ich versuche es und wenn es nicht klappt melde ich mich heute Abend noch mal!
Danke!
-
Hallo,
ich bin dran, es dauert einen Moment ...
Gruß
Oliver
-
Hi,
also hier jetzt der mögliche Code: (Vors.: Jede Zeile der Datei wird mit ";" abgeschlossen!!)
Sorry, aber der eine Free()-Befehl führt zum Absturz, vielleicht hat einer eine Idee, warum?Aber so kann man es grundsätzlich machen.
GrußOliver
So sieht die Datei aus:
Aktuelleschnitstelle=COM1;
Baudrate=9600;
Datenbits=8;
Parität=Keine;
Stopbits=1;
Datenfluss=ON;#include "stdafx.h" #include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib.h> int ini(void) { FILE *File; char *msg; char *wert; int PORT; int BAUD; msg = (char *) malloc(80); wert = (char *) malloc(80); File = fopen("c:\\Projekt\\komm.ini","r"); if (File != NULL) { while(!feof(File)) { fgets(msg,80,File); wert = strtok((char *) msg, (const char *) "="); if (strcmp(wert,"Aktuelleschnitstelle")==0) { wert = strtok((char *) NULL, (const char *) ";"); PORT=0x3F8; printf("\n Der Port ist: %s", wert); } if (strcmp(wert,"Baudrate")==0) { wert = strtok((char *) NULL, (const char *) ";"); BAUD=atoi(wert); printf("\n Die Baudrate ist: %s", wert); } if (strcmp(wert,"Datenfluss")==0) { wert = strtok((char *) NULL, (const char *) ";"); printf("\n Der Datenfluss ist : %s", wert); } } fclose(File); } else { printf("Datei nicht vorhanden!"); } //free( wert ); free( msg ); printf("\n\n"); gets(wert); return 0; } int main(int argc, char* argv[]) { int retcode = ini(); return 0; }
-
moin meister ...
strtok liefert einen Zeiger auf den Beginn der gefundenen Zeichenfolge in s1 zurück. Wenn keine weitere Zeichenfolge gefunden wird, ist der Rückgabewert NULL.
.... while(!feof(File)) { fgets(msg,80,File); wert = strtok((char *) msg, (const char *) "="); ....
ich vermute mal, dass in der ini-Datei als auch nach der letzen Zeile ein
Zeilenumbruch steht.
Wenn das so ist liest du die letzte Zeile ein, das Dateiende ist aber noch nicht
erreicht, weil fgets bis zum Zeilenumbruch liest, es müsste aber praktisch weiter lesen um festzustellen, dass das Dateiende erreicht ist.Also wird die Schleife nach der letzen Zeile nicht abgebrochen, und fget wird wieder aufgerufen, jetzt wird das Dateiende erreicht, was in msg steht weiss ich nicht w*****einlich NULL. Daraufhin wird strtok((char*) 'NULL', ...); aufgerufen, was wiederum zur Folge hat, dass wert = NULL gesetzt wird.
Die Schleife wird nun abgebrochen weil eof erreicht und
free(wert) oder free(NULL) ! aufgerufen -> Absturtz.ohne die Schleifenlogik zu ändern würde ich einen BackupZeiger für wert einrichten und wie folgt verwenden ...
char *wert_bup; .... while(!feof(File)) { fgets(msg,80,File); wert_bup = wert; wert = strtok((char *) msg, (const char *) "="); if(wert == NULL) wert = wert_bup; .... } free(wert);
-
N'Abend größter aller Meister,
Ah jetzt ja! Das könnte eine mögliche Erklärung sein! Hmmmhh, aber ganz verstanden habe ich das noch nicht. Also, der Wert von "Wert" ist zuletzt "Null"? Und deswegen kann ich den mit malloc allokierten Datenspeicher nicht über free freigeben
?? Könnte der größte aller Meister dazu vielleicht noch was sagen?
Danke!
Oliver
[ Dieser Beitrag wurde am 18.01.2003 um 21:15 Uhr von oj0169 editiert. ]
-
hi, warum so umstaendlich........ um eine .ini datei auszulesen brauchst du nur folgende funktion GetPrivateProfileString()
-
Hi,
weil ich die Funktion nicht kannte!!??!!
[ Dieser Beitrag wurde am 20.01.2003 um 07:00 Uhr von oj0169 editiert. ]
-
Danke für die Lösung..
Mensch da bekommt man ja echt kopfschmerzen sorry aber wenn ich schon INI Dateien verwende, dann nimm bitte auch die dazugehörigen Informationen wie GetPrivateProfileString etc. (siehe toom)
Da kannst du dir das ganze Parsen der Datei sparen..Das tut wirklich weh....
Sorry nicht persönlich nehmen..
-
Danke leute!(OLIVER)
Ihr hat mir echt geholfen!:)!
-
Hallo,
ja, Ihr habt mir auch geholfen. Ich brauche dasselbe nämlich auch demnächst.
Vielen Dank.
Oliver
-
moin meister ...
Ich glaube das Problem mit den Ini´s hat sich gelöst ...
Zu dem Problem mit dem free ... kurz nochmal:
main()
{
char* szWert = (char*) malloc(80);
szWert = NULL;
free(szWert); // *knall*
return 0;
}und nicht anderes macht dein Programm beim lesen der letzen Zeile, weil in der letzen Zeile offensichtlich nichts mehr drinn steht, weil die vorletzte Zeile mit einen '\n' endet.
mfg
RB