Anzeige:
Ergebnis 1 bis 13 von 13

Thema: Für mein erstes C-Programm brauch ich Hilfe.

  1. #1
    Registrierter Benutzer
    Registriert seit
    27.10.2003
    Beiträge
    30

    Für mein erstes C-Programm brauch ich Hilfe.

    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
    -- May the source be with you --

    C, HTML and Bash-Scripts !!!

  2. #2
    Registrierter Benutzer
    Registriert seit
    20.07.2003
    Beiträge
    147
    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.

  3. #3
    Registrierter Benutzer
    Registriert seit
    27.10.2003
    Beiträge
    30
    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
    -- May the source be with you --

    C, HTML and Bash-Scripts !!!

  4. #4
    Registrierter Benutzer
    Registriert seit
    20.07.2003
    Beiträge
    147
    mit `free()`

    EDIT:

    vielleicht interessiert dich auch realloc().

    schau einfach mal unter http://www.gnu.org/software/libc/man...d%20Allocation .
    Geändert von sagi (06-11-2003 um 10:57 Uhr)

  5. #5
    Registrierter Benutzer
    Registriert seit
    27.10.2003
    Beiträge
    30
    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);
    }
    }
    -- May the source be with you --

    C, HTML and Bash-Scripts !!!

  6. #6
    Registrierter Benutzer
    Registriert seit
    20.07.2003
    Beiträge
    147
    genau so.

    mfg

    c.

  7. #7
    Registrierter Benutzer
    Registriert seit
    27.10.2003
    Beiträge
    30
    Es funzt leider nicht.

    Wie bringe ich die folgende Variabalendeklaration in while unter ?

    char *TMP_SOURCE;
    Geändert von leukozyt (06-11-2003 um 16:25 Uhr)
    -- May the source be with you --

    C, HTML and Bash-Scripts !!!

  8. #8
    Registrierter Benutzer Avatar von tuxipuxi
    Registriert seit
    30.08.2002
    Beiträge
    667
    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.

  9. #9
    Registrierter Benutzer
    Registriert seit
    27.10.2003
    Beiträge
    30
    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.
    Geändert von leukozyt (06-11-2003 um 16:31 Uhr)
    -- May the source be with you --

    C, HTML and Bash-Scripts !!!

  10. #10
    Registrierter Benutzer Avatar von tuxipuxi
    Registriert seit
    30.08.2002
    Beiträge
    667
    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.

  11. #11
    Registrierter Benutzer
    Registriert seit
    27.10.2003
    Beiträge
    30
    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.
    Geändert von leukozyt (06-11-2003 um 17:01 Uhr)
    -- May the source be with you --

    C, HTML and Bash-Scripts !!!

  12. #12
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    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).
    Code:
      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);
    	  }
        }
      }

  13. #13
    Registrierter Benutzer
    Registriert seit
    20.07.2003
    Beiträge
    147
    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.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •