Compilieren tut er Problemlos aber sobald ich es dann ausführe gibt es
einen Speicherzugriffsfehler. Hat jemand eine Idee warum?
Wenn ich den Code ein wenig ändere und die Werte nicht in ein Array
schreibe sondern in ein paar hundert Dateien klappt alles prima. Ich
will aber mit den Werte noch rechnen alse wäre ein Array ziemlich
wichtig für mich. Achja und es wäre nett wenn wir noch jmd. sagen könnte
wie ich den Speicher hinterher wieder ordentlich frei mache.
Vielen Dank für eure Hilfe.
Wenn ich solche Zeilen sehe verliere ich ganz schnell die Lust mich mit
dem Code respektive Problem zu beschäftigen, das geht bestimmt deutlich
einfacher. Und getparameter() kenne ich auch nicht...
Das hier
1
if(!fi)printf("not opened");
wäre so
1
if(!fi)
2
{
3
fprintf(stderr,"...");
4
exit(1);//Programm beenden, ohne Datei gehts nicht weiter!
5
}
übrigens deutlich besser.
Also: Was genau soll der Code machen? Alle nötigen Informationen angeben
bitte!
Hi das mit der Formatierung tut mir Leid. Ich gebe zu das das Programm
vielleicht nicht besonders toll und effektiv ist. Aber es ist auch nur
für mich gedacht.
Was es machen soll:
Ich habe eine Binär-Datei mit Ascii Header. Die Binärdaten geben jeweils
eine Reihe von Spannungswerte an die an einem Punkt X/Y aus
verschiedenen DACs bei verschiedenen Spannungen werden ausgelesen
werden. Ich will die Daten dann in einem 4-Dim Array haben
value[X][Y][DACNummer][Spannung]=2.1V. Wenn ich das habe, will ich dann
Maps bei Fixer Spannung erstellen oder Mittelewerte über verschiedene
X/Y Punkte berechnen.
Hier die fehlenden Zeilen.
Und danke für den Tip mit CODE:BLOCKS. Ich habe immer alles mit meinem
einfachen Editor geschrieben jetzt weiß ich auch warum das bei andern
immer besser aussieht.
Mal etwas OT:
M. M. schrieb:> So nochmal den Fehlenden Code in hübscher.
Sehr schön. ;-)
Nur um Missverständnisse zu vermeiden: Es gibt verschiedene Arten seinen
Code zu formatieren, diese Frage dürfte ähnlich wie der Vergleich
AVR<->PC eine religiöse Angelegenheit sein. Wichtig ist aber: Egal wie
man es macht, es muss durchgängig so gemacht sein und einigermaßen
übersichtlich.
Ob man nun
1
voidfoo(void)
2
{
3
for(){
4
...
5
}
6
}
oder
1
voidfoo(void)
2
{
3
for()
4
{
5
...
6
}
7
}
schreibt ist egal (mir gefällt die 2. Version deutlich besser), sowas
1
voidfoo(void)
2
{
3
for(){
4
...
5
}
6
}
ist aber definitiv unbrauchbar. Der Code-Formatter von C::B sollte nur
ein Behelfswerkzeug sein um fremdem Code überhaupt irgendeine Struktur
zu verpassen oder seinen persönlichen Vorlieben anzupassen. Seine
eigenen Programme sollte man bereits beim Tippen vernünftig formatieren,
in C ist das extrem wichtig und kann einige Fehler aufdecken.
Falls du mit "Editor" notepad.exe meinst, das ist in der Tat nicht
besonders bequem. C::B ist aber eine komplette IDE, zum Tippen reicht
Programmer's Notepad o.ä.
BTT:
> Ich habe eine Binär-Datei mit Ascii Header. Die Binärdaten geben jeweils> eine Reihe von Spannungswerte an die an einem Punkt X/Y aus> verschiedenen DACs bei verschiedenen Spannungen werden ausgelesen> werden. Ich will die Daten dann in einem 4-Dim Array haben> value[X][Y][DACNummer][Spannung]=2.1V. Wenn ich das habe, will ich dann> Maps bei Fixer Spannung erstellen oder Mittelewerte über verschiedene> X/Y Punkte berechnen.
Puh, vierdimensionale Arrays und malloc()...
Poste mal ein Beispiel wie die Dateien die du verarbeiten willst
genau(!) aufgebaut sind und verpasse deinem Code ein paar sinnvolle
Kommentare (welcher Block macht was, wozu sind die "Magic Numbers" = im
Quellcode vorhandene Zahlen wie in "...+4" gut usw).
Ich muss zugeben ich bin zu faul aus dem vorhandenen Code die Struktur
der Daten zu ermittlen um dann zu versuchen den Code zu verstehen.
Die Daten kommen aus einem SPM-Controller von Nanonis. Das geben sie als
Datei Beschreibung an.
header:
Grid dim="24 x 24"
Grid settings=0.000000E+0;0.000000E+0;6.880776E-9;6.880776E-9;-
2.244028E+1
Sweep Signal="Bias (V)"
Fixed parameters="Sweep Start;Sweep End"
Experiment parameters="X (m);Y (m);Z (m);Z Offset (m);Settling time
(s);Integration time (s)"
# Parameters (4 byte)=8
Experiment size (bytes)=2048
Points=256
Channels="Current (A);Current [bwd] (A)"
Experiment="Grid Spectroscopy"
Date="30.08.2006 14:52:45"
User=user1
:HEADER_END:
continued by, in hexadecimal representation:
0d
00
31
79
0a c0 00 00 00 40 00 00 00 b0 f6 18 55 b1 94 18 42 b0 84 7c 66
00 00 00 39 51 b7 17 38 d1 b7 17 ae ca c3 f0 ae c6 60 e3 ae c2
bf ae bf 5a a3 ae c5 af f1 ae be e8 94 ae ba 8e 31 ae b7 d9
...
where 0d 0a is the end of line after the :HEADER_END:. Then, c0 00 00 00
(= -2) is the first fixed
parameter (Sweep Start) and so on. 38 d1 b7 17 (=1E-4) corresponds to
the last paramter
(Integration time (s)). After that 256 values of the first data channel
(Current (A)) will follow,
starting with ae ca c3 f0 (= -9.2207E-11). Next will be 256 values of
the second data channel
(Current [bwd] (A)). As no more channels were acquired this will
finalize the first experiment and
the data will continue with the parameters of the 2nd experiment.
Die Sache mit den +4 und umdrehen ist ein Problem von endian floats oder
halt nicht auf den unterschiedlichen Rechnern. Was ich am Schluß machen
will ist: ein Rechteck X mal Y auswählen und die Daten mitteln. Dann
Ableiten und dann Normieren. Details hab ich mir noch nicht überlegt.
Ich habe das früher alles als bash-script machen können weil die alte
Hardware alles hübsch in Ascii ausgespuckt hat. Nun ist die Hardware
modern und auch die Datenmenge ist explodiert. Nachdem ich alles in
Ascii hab sind die Bash Sachen einfach super langsam und ich dachte das
müßte mit C viel schneller gehen.
Hast du mal ein paar printf dazwischen gemacht, damit du siehst WO das
Proramm aussteigt.
Hast du auch daran gedacht das die Indizes von 0 bis max-1 gehen.
Also wenn dein 'Grid dim="24 x 24" ' gehen die Inizes von 0 bis 23 oder
von 0 bis 24?
M. M. schrieb:> Compilieren tut er Problemlos aber sobald ich es dann ausführe gibt es> einen Speicherzugriffsfehler. Hat jemand eine Idee warum?
Der Debugger hat wahrscheinlich eine. Was sagt der denn?
Rolf Magnus schrieb:> Der Debugger hat wahrscheinlich eine. Was sagt der denn?
wenn er mit Notepad coded, wird er wohl kaum einen Debugger kennen.
Tip:
mit c++ kann man sich das um einiges einfacher machen, wenn man zB die
vector Klasse benutzt, die sich selbst um den Speicher kümmert
Achso:
ich würde mir nicht die Mühe machen, 4 dimensionale Arrays zu bauen.
Alloziiere den Speicher en bloc und überlege dir wie du die Indizes auf
das lineare Array mapst.
Das erspart einem die fehglerträchtigen malloc und free schleifen
Auserdem würde ich das ganze ein wenig besser kapseln
rups schrieb:> value[X][Y][DACNummer][Spannung]
1
/**
2
* Structure that holds the data from an measurement file
3
*/
4
typedefstructData{
5
uint32_txCount;/**< number of x Coordinates */
6
uint32_tyCount;/**< number of < Coordinates */
7
uint32_tdacCount;/**< number of used DACs */
8
uint32_tvCount;/**< number of measurements per DAC */
9
float*data;/**< array that holds the measurements */
10
}Data;
11
12
13
/** reads a file and creates Data object.
14
* @return pointer to initialized Data structure\n
15
* Has to be freed witch Data_delete
16
*/
17
Data*Data_readFromFile(constchar*i_file)
18
{
19
Data*data=malloc(sizeof(Data));
20
uint32_ti;
21
uint32_tdataCount;
22
//header lesen und o_data befüllen
23
24
dataCount=data->xCount
25
*data->yCount
26
*data->dacCount
27
*data->vCount;
28
29
30
data->data=malloc(dataCount*sizeof(*data->data));
31
32
// Nicht vergessen: bei lesefehler bisher geholten Speicher wieder freigeben!!!
33
34
// datenbereich einlesen und in o_data->data schreiben.
35
//for
36
// *Data_getPtr(...) = eingelesener wert
37
//
38
}
39
40
/** frees the given Data object */
41
voidData_delete(Data**data)
42
{
43
free((*data)->data);
44
free(*data);
45
*data=NULL;
46
}
47
48
49
/** returns a pointer to the data defined by the adress parameters*/
DirkB schrieb:> Hast du mal ein paar printf dazwischen gemacht, damit du siehst WO das> Proramm aussteigt.>> Hast du auch daran gedacht das die Indizes von 0 bis max-1 gehen.>> Also wenn dein 'Grid dim="24 x 24" ' gehen die Inizes von 0 bis 23 oder> von 0 bis 24?
Man man bin ich doof!
Na klar bekommt man einen Speichzugriffsfehler wenn man das Array von 0
bis 23 initalisiert und dann auf nummer 24 zugreifen will!
Danke das hat mir sehr geholfen.
Auch an Vlad Tepesch vielen Dank. Leider sind meine Kentnisse in C++
noch schlechter als in C. Deinen anderen Vorschlag werde ich mir mal
annschauen.
Bei derart vielen verschachtelten malloc solltest Du auch prüfen ob Dir
malloc überhaupt noch Speicher liefert, sonst knallts auch irgendwann.
M. M. schrieb:> Achja und es wäre nett wenn wir noch jmd. sagen könnte> wie ich den Speicher hinterher wieder ordentlich frei mache.
Ganz einfach in der umgekehrten Reihenfolge, z.B.