Komisches Verhalten für char
-
Hallo,
ich habe hier ein kleines Code-Stück, wo ich ein paar Konstanten anderen
Parametern übergebe. Nur leider gibt es bei der Übergabe von Srings Probleme.#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { . . . const char *File2Read; const char *File2Write; } Constants; typedef struct { const char *itc_exp; double c_s; double T; double z_p; double eps_r; double R_max; double R_min; double shift; double width; } itc; Constants FC; void SetConstants (const char *experiment) { size_t itc_data_set, i = 0, itc_data_index; static itc itc_exp_settings[] = { /* data c_s T z_pro eps_r R_max R_min shift width */ {"papin-29K", 0.007, 298., 4.9, 78.44, 176.1, 142.0, 59988.5, 32028.6}, {"papin-31K", 0.007, 303., 4.9, 76.68, 174.8, 147.9, 66782.3, 41080.4}, {"papin-30K", 0.007, 308., 4.9, 75.00, 175.6, 128.8, 56390.4, 21751.8}, {"papin-1238K", 0.017, 298., 4.9, 78.44, 168.3, 148.8, 59912.7, 75091.8}, {"papin-1323K", 0.017, 303., 4.9, 76.68, 168.8, 148.6, 56063.2, 57121.6}, {"papin-1328K", 0.017, 308., 4.9, 75.00, 167.0, 148.1, 49827.5, 59381.0} }; itc_data_set = sizeof(itc_exp_settings)/sizeof(itc); itc_data_index = itc_data_set + 1; /* check for experimental data and if necessary exit program */ for (i=0; i<itc_data_set; i=i+1) { if (strcmp(experiment, itc_exp_settings[i].itc_exp) == 0) { itc_data_index = i; break; } } if (itc_data_index == itc_data_set+1) { printf("\nData for ITC experiment not found. Program terminated.\n\n"); exit(EXIT_FAILURE); } else { FC.cs = itc_exp_settings[itc_data_index].c_s; FC.T = itc_exp_settings[itc_data_index].T; FC.zp = itc_exp_settings[itc_data_index].z_p; FC.epsilon_r = itc_exp_settings[itc_data_index].eps_r; FC.Rmax = itc_exp_settings[itc_data_index].R_max; FC.Rmin = itc_exp_settings[itc_data_index].R_min; FC.shift = itc_exp_settings[itc_data_index].shift; FC.width = itc_exp_settings[itc_data_index].width; char read[256]; sprintf(read, "data/%s.dat", itc_exp_settings[itc_data_index].itc_exp); FC.File2Read = read; char write[256]; sprintf(write, "data/%s-fit.dat", itc_exp_settings[itc_data_index].itc_exp); FC.File2Write = write; } } int main (int argc, char *argv[]) { /*** main routine ***/ SetConstants ("papin-29K"); printf("FC.File2Read: %s\n" "FC.File2Write: %s\n" "FC.cs: %.4f\n" "FC.T: %.4f\n" "FC.zp: %.4f\n" "C.epsilon_r: %.4f\n" "FC.Rmax: %.4f\n" "FC.Rmin: %.4f\n" "FC.shift: %.4f\n" "FC.width: %.4f\n", FC.File2Read, FC.File2Write, FC.cs, FC.T, FC.zp, FC.epsilon_r, FC.Rmax, FC.Rmin, FC.shift, FC.width); }
Das was ich in main() erhalte sieht so aus:
FC.File2Read: �_r�`=˿�jr�4=˿�4q�$=˿��=˿Tjr�
FC.File2Write: data/papin-29K-fit.dat
FC.cs: 0.0070
FC.T: 298.0000
FC.zp: 4.9000
C.epsilon_r: 78.4400
FC.Rmax: 176.1000
FC.Rmin: 142.0000
FC.shift: 59988.5000
FC.width: 32028.6000Z.B. wir hier FC.File2Read komplett 'komisch' dargestellt; aber auf Arbeit
wird es nur bis "data/papin-29K." dargestellt. Wobei FC.File2Write hier richtig
dargestellt wird und auf Arbeit nur "@" dargestellt wird.Hatte jemand auch solche Probleme gehabt?
-
simsa schrieb:
char read[256];
sprintf(read, "data/%s.dat", itc_exp_settings[itc_data_index].itc_exp);
FC.File2Read = read;read ist eine lokale Variable, dein Zeiger zeigt also nach Verlassen der Funktion in die Pampa -- undefiniertes Verhalten.
-
Hi Bashar,
im obigen Code hatte ich in SetConstants (const char *experiment) das
Constants FC definiert, das war Falsch. In mein Code ist es Global definiert.
Das habe ich nun korrigiert.Wenn read in die Pampa zeigt, warum zeigt denn write auch nicht in die Pampa?
Auf Arbeit wird read bis auf die letzten drei Buchstaben korrekt angezeigt, daher
kann ich mir irgendwie nicht vorstellen, dass es dort in die Pampa zeigt.Grüße,
simsa
-
simsa schrieb:
im obigen Code hatte ich in SetConstants (const char *experiment) das
Constants FC definiert, das war Falsch. In mein Code ist es Global definiert.
Das habe ich nun korrigiert.Vollkommen egal, es geht um read und write.
Wenn read in die Pampa zeigt, warum zeigt denn write auch nicht in die Pampa?
Auch write zeigt in die Pampa, ich dachte das sei klar.
Auf Arbeit wird read bis auf die letzten drei Buchstaben korrekt angezeigt, daher
kann ich mir irgendwie nicht vorstellen, dass es dort in die Pampa zeigt.Dann arbeitest du besser an deiner Vorstellung. Was erwartest du, eine Messagebox mit "Ihr Zeiger ist ungültig!"? Da wird einfach Speicher überschrieben oder auch nicht, das entzieht sich weitestgehend deiner Kontrolle. Deshalb ja auch undefiniertes Verhalten.
-
Bashar schrieb:
Auch write zeigt in die Pampa, ich dachte das sei klar.
Das ist alles seltsam. Wie sieht es denn richtig aus?
-
simsa schrieb:
Bashar schrieb:
Auch write zeigt in die Pampa, ich dachte das sei klar.
Das ist alles seltsam.
Nein, das gehört zu dem absolut grundlegenden, was du verstehen musst, wenn du jemals in deinem Leben produktive C-Programme (oder C++) schreiben willst.
Wie sieht es denn richtig aus?
Es gibt viele Möglichkeiten. Zwei prinzipielle Wege: Entweder die Zeiger weg und dafür direkt Arrays (File2Read und File2Write) in die Struktur packen. Oder die Zeiger auf dynamisch allozierten Speicher zeigen lassen (malloc), nachher das free nicht vergessen.