PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Für mein erstes C-Programm brauch ich Hilfe.



leukozyt
05-11-2003, 18:08
Hi Leute,

ich lerne C seit 4-5 Tagen und will jetzt schon mein erstes Programm schreiben.
Weil es zu langweilig und sehr nerfenraubend ist, nur Kurse durchzuarbeiten,
bitte ich um Eure Hilfe.

Mein Prog. soll eine Senderliste nach dem Alphabeth sortieren.

Das Problem was sich jetzt schon habe, ist die Variablen deklaration.
Mehrere Variablen mit dem gleichen Namen initalisieren geht wohl nicht, wie auch ?
Wenn ich jetzt aber der selben Variable (TMP_SOURCE) immer wieder einen neuen Wert zuweisen möchte
bekomme ich eine Fehlermeldung :-(

Programmcode:
strncpy(TMP_SOURCE, IO_STREAM, COUNTER);

Fehlercode:
Program received signal SIGSEGV, Segmentation fault.
0x40092492 in strncpy () from /lib/libc.so.6
(gdb)



Mal ein Auszug aus der zuändernden Datei:

$ cat /tmp/channels.conf
:ARD
ARD Online-Kanal:12187:h:S19.2E:27500:0:1801,1802,1803,1804,1 805,1806,1807:0:0:12090:1:0:0
Das Erste:11836:h:S19.2E:27500:101:102:104:0:28106:1:0 :0
Bayerisches FS:11836:h:S19.2E:27500:201:202:204:0:28107:1:0:0
hessen fernsehen:11836:h:S19.2E:27500:301:302:304:0:28108 :1:0:0
arte:11836:h:S19.2E:27500:401:402,403:404:0:28109: 1:0:0
SR Fernsehen Suedwest:11836:h:S19.2E:27500:501:502:504:0:28110: 1:0:0
WDR FERNSEHEN:11836:h:S19.2E:27500:601:602:604:0:28111 :1:0:0
BR-alpha:11836:h:S19.2E:27500:701:702:704:0:28112:1:0 :0
SÜDWEST BW:11836:h:S19.2E:27500:801:802:804:0:28113:1:0:0
Phoenix:11836:h:S19.2E:27500:901:902:904:0:28114:1 :0:0
Bayern 4 Klassik:11836:h:S19.2E:27500:0:3001:0:0:28120:1:0: 0
B5 aktuell:11836:h:S19.2E:27500:0:3101:0:0:28121:1:0: 0
hr-skyline:11836:h:S19.2E:27500:0:3201:0:0:28122:1:0: 0
...

Mein Script hänge ich in den Anhang.
Bitte helft mit, so macht Programmieren erst trichtig Spaß.

MfG
Leukozyt

sagi
05-11-2003, 19:25
ich vermute, dass du einen der 2 Punkte nicht beachtet hast:

1) TMP_SOURCE muss ein Pointer sein

2) du musst den Speicher mit malloc alloziieren.

mfg

c.

leukozyt
06-11-2003, 00:08
Mein Problem ist nicht die Initalisierung an sich.
Das Problem ist die Wertzuteilung nach der Initalisierung mit strncmp().
Beim ersten Durchlauf der Schleife habe ich kein Problem mit der Variablendeklarierung.
Wenn aber die Schleife das zweite mal durchläuft gibts einen Fehler.

Ich würde mal sagen ich brauche das Gegenstück zu 'malloc' !
Wie kann ich eine Variable endladen (killen oder vernichten) ?
Gibt es sowas und wenn ja wie ist die Deklariereung ?

MfG
Leukozyt

sagi
06-11-2003, 10:53
mit `free()`

EDIT:

vielleicht interessiert dich auch realloc().

schau einfach mal unter http://www.gnu.org/software/libc/manual/html_node/Unconstrained-Allocation.html#Unconstrained%20Allocation .

leukozyt
06-11-2003, 14:04
Danke.
Es müßte die Lösung sein.

Wie initalisiere ich dann eine array-arrow-Variable (Aufzählung und Zeiger), in einer Funktion ?
Bzw. ist meine folgende Vorstellung richtig ?

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

/* ++++++++++++++++++++++++++++++++++++++++++++++++ */
/* Diese Variabale möchte ich in Main bzw in while unterbringen. */
/* ++++++++++++++++++++++++++++++++++++++++++++++++ */
char *TMP_SOURCE;

void main(void)
{
while(1)
{
if((TMP_SOURCE = (char *) malloc(20)) == NULL)
{
printf( "Error, not enough memmory.\nProgramm exit now.\n");
exit(1);
}
free(TMP_SOURCE);
}
}

sagi
06-11-2003, 14:42
genau so.

mfg

c.

leukozyt
06-11-2003, 16:17
Es funzt leider nicht.

Wie bringe ich die folgende Variabalendeklaration in while unter ?

char *TMP_SOURCE;

tuxipuxi
06-11-2003, 16:22
Original geschrieben von leukozyt
Es funzt leider nicht.

Wie bringe ich die folgende Variabale in while unter ?

char *TMP_SOURCE;

was meinst du mit "in while unter" bringen?

gruss,

tuxipuxi.

leukozyt
06-11-2003, 16:27
Ich möchte die Variable deklarieren
und dann mit malloc die Speicheradresse zuteilen lassen.
Das Ding soll dann ausgelesen werden und zu guter letzt mit free() wieder gelöscht werden.

Dieser Vorgang den ich grade beshrieben habe soll in einer Schleife ausgeführt werden.

tuxipuxi
06-11-2003, 16:40
hi,

wieso schreibst du das nicht einfach vor/in die schleife? eine while bedingung ist nicht fuer deklarationen gedacht... und aendert an deinem problem auch nichts.

gruss,

tuxipuxi.

leukozyt
06-11-2003, 16:57
Jetzt raffe ich nix mehr.

Wie würdet Ihr dann mein Problem lösen.

Um mein Script ausführen zu können brauch man einen channels.conf-Datei.

$ cat /tmp/chanels.conf
Das Erste:11836:h:S19.2E:27500:101:102:104:0:28106:1:0 :0
Bayerisches FS:11836:h:S19.2E:27500:201:202:204:0:28107:1:0:0
hessen fernsehen:11836:h:S19.2E:27500:301:302:304:0:28108 :1:0:0
arte:11836:h:S19.2E:27500:401:402,403:404:0:28109: 1:0:0
...

Das Script hänge ich wiedemal in den Anhang.
Es geht bis jetzt immernoch darum TMP_SOURCE immerwieder einen neuen Wert zuzuteilen.

wraith
06-11-2003, 17:46
Also ganz hab' ich nicht verstanden was das Programm machen soll (alleine schon die GROß geschriebenen Variablennamen haben mich verwirrt,dachte es wäre Fortran ^^).
Ich würde es so machen (wenn das die Intention des Programm ist).


TMP_SOURCE = 0;

if ((FILE_CHANNELS = fopen(FILEPATH_CHANNELS_READ, "r")) != NULL)
{
while(fgets(IO_STREAM, sizeof IO_STREAM, FILE_CHANNELS) != NULL)
{
char *p;
if(strlen(IO_STREAM) < 25)
continue;

if(p = strchr(IO_STREAM,TAB))
{
TMP_SOURCE = realloc(TMP_SOURCE,(TMP_SOURCE ? strlen(TMP_SOURCE) : 0) + (p - IO_STREAM) + 1);
*p = 0;
strcat(TMP_SOURCE,IO_STREAM);
}
}
}

sagi
06-11-2003, 18:33
Original geschrieben von tuxipuxi
eine while bedingung ist nicht fuer deklarationen gedacht

doch. eine schleife ist ein Anweisungsblock und daher fuer Deklarationen geeignet.

mfg

c.