Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Anfänger braucht Hilfe

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
27.10.2008, 09:52 Uhr
Thomas_C



Hi,

ich versuche gerade erste Schritte mit dem Buch "Programmieren in C von Kernighan und Ritchie". In Kapitel 1.9 ist ein Programm abgedruckt, mit dem die längste Zeile ausgegeben wird, die eingegeben worden ist. Der Yuellcode sieht so aus:

C++:
#include <stdio.h>
#define MAXLINE 1000 /* maximale Länge einer Eingabezeile */


int getline(char line[], int maxline);
void copy(char to[], char from[]);

/* Längste Eingabezeile ausgeben */
main()
{
    int len;                 /* Länge der momentanen Eingabezeile */
    int max;                /* bisheriges Maximum */
    char line[MAXLINE];     /* momentane Eingabezeile */
    char longest[MAXLINE];  /* bisher längste Zeile */
    
    max=0;
    while((len=getline(line,MAXLINE)) > 0 )
        if(len>max){
            max=len;
            copy(longest,line);
    }
    if(max>0)
        printf("%s", longest);
    return 0;
}

int getline(char s[], int lim)
{
    int c,i;
    
    for(i=0; i<lim-1 && (c=getchar())!= EOF && c !='\n'; ++i)
        s[i] = c;
    if (c=='\n'){
        s[i]=c;
        ++i;
    }
    s[i]='\0';
    return i;
}

void copy (char to[], char from[])
{
    int i;
    
    i=0;
    while ((to[i] =from [i]) != '\0')
        ++i;
}

Nun mein Problem:

Ich kann leider nicht erkennen, wie die längste Textzeile in longest gespeichert wird.
Ausserdem ist longest doch ein Vektor mit bis zu 1000 Elementen.
In dem Printf wird longest aber ohne Index angegeben.
Das in der Routine copy unter bestimmten Umständen was kopiert wird, hab ich gesehen. Copy gibt aber keine Werte zurück, hier verwendete Variablen sind doch auch nur in Copy gültig, wie kommt die längste Zeichenkette nach longest

Wäre nett, wenn mir jemand helfen könnte, habe irgendwie den Faden verloren.


Vielen Dank schon mal im Vorraus.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.10.2008, 10:06 Uhr
0xdeadbeef
Gott
(Operator)


char ist ein Zeichen, ein Array von chars wird in C üblicherweise als Zeichenkette benutzt (terminiert durch ein Null-Zeichen, den sog. Sentinel). longest ist dementsprechend eine Zeichenkette von bis zu 999 Zeichen (das Tausendste wird für den Sentinel benötigt).

Was copy angeht, Arrays werden...quasi per Referenz an Funktionen übergeben. Genau genommen degradiert ein Array bei der Übergabe als Parameter zum Zeiger, im Endeffekt läuft es aber darauf hinaus, dass, wenn du longest in main als to an copy übergibst und dann in copy in to schreibst, longest in main verändert wird.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.10.2008, 10:14 Uhr
Thomas_C



Danke schon mal für die schnelle Antwort, aber ehrlich gesagt habe ich nichts verstanden.
Das Programm überschreibt also die Variable longest ind der Copy Routine.
Aber die Routine Copy wird coh mit zwei Vektoren aufgerufen (longest und line). Wenn ich das richtig verstanden habe, können keine Vektoren als solches übergeben werden, sondern ich übergebe das erste Elements des Vektors, und wenn nötig zusaätzlich noch den Index)

Copy wird in Main aber mit den beiden Parametern aufgerufen und gibt nichts zurück. Wo wirtd denn jetzt definiert, das Werte an longest zurückgegeben werden und nicht an z.B. line.

Ich hoffe das ich mich so ausdrücken konnte, das jemand verstehen kann wo ich hängen geblieben bin.

Da ich das selber nicht weiss, kann ich das auch nicht besser erklären.

Aber toll wie schnell hier geantwortet wird.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.10.2008, 10:33 Uhr
0xdeadbeef
Gott
(Operator)


Du übergibst im Grunde die Speicheradresse des Arrays, die der des ersten Elements entspricht.

Beim Aufruf

C++:
copy(longest, line);


wird longest als erster und line als zweiter Parameter übergeben. Da copy als

C++:
void copy (char to[], char from[]);


deklariert ist, bedeutet das, dass in dem entsprechenden Durchlauf von copy longest als to und line als from bekannt sind. Die Zuweisung in to (und dementsprechend in longest) findet dann

C++:
while ((to[i] =from [i] /* <-- hier */) != '\0')


statt.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
27.10.2008, 11:55 Uhr
Thomas_C



Hallo schon wieder,

eines meiner Probleme ist auf jedenfall schonmal folgendes:
Ich rufe von der Routine main() meine Routine copy(Parameter) auf.
In Main sieht der Aufruf ja wiefolgt aus:
copy(longest,line)

Die Arrays werden in main als longest[MAXLINE], also 1000 deklariert, ebenso wie line[MAXLINE].

Da ich die Routine copy wie oben beschrieben aufrufe, sind die Zahelnwerte für den Aufruf doch eigentlich 0, oder nicht.

In der Routine getline bekomme ich als Return-Value die Variable i, die steht ja für die länge der aktuellen Zeile.

Die Ensteheung von len kann man ja klar nachvollziehen, aber bei dem Rest gehe ich irgendwie noch verloren.


Schon wiedermal vielen Dank, ich hoffe Ihr habt noch die Nerven das einem Anfänger auch zum 3.Mal zu erklären.


Bis dann.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
27.10.2008, 12:19 Uhr
Thomas_C



Hallo nochmal, eine weitere Frage zum Thema:

Bedeutet das, das die Funktion Copy als void aufgerufen wird, die Übergabeparameter die in Main übergeben werden in der Funktion wieder überschrieben werden???

Wenn ja würde doch immer das erste Element des Arrays bearbeitet, also dann doch immer das gleiche oder nicht.

Ich glaub ich brauch noch nen Kaffee.


Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
27.10.2008, 12:51 Uhr
ao

(Operator)


line und longest sind zwei Speicherbereiche, jeweils 1000 Zeichen lang. Wenn die an die Funktion copy übergeben werden, übergibt man in Wahrheit die Adresse des jeweils ersten Elements, oder mit anderen Worten, einen Pointer auf das erste Element. Das ist in C so.

Die restlichen Elemente liegen unmittelbar dahinter, auch das ist in C immer so, Arrays hängen zusammen.

Die Funktion copy spricht die Speicherstellen der Reihe nach an, indem der Index i bei 0 beginnt und von einem Schleifendurchlauf zum nächsten um 1 hochgezählt wird.

Hilft das weiter?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
27.10.2008, 13:06 Uhr
Thomas_C



oK, die Werte werden an Copy übergeben, aber da die Arrays ohne Zeiger angegeben werden, fängt Copy doch immer bei 0 an, i ist dann der Zeiger.
Wird kein Sentinel gefunden, wird i inkrementiert, die Funktion läuft also weiter.

Was mir aber immernoch nicht klar ist, ist wie kommt die Zeichenkette nach longer.
In Getline werden die aktuellen zeichen in s[i] gespeichert.

Ich versteh einfach nicht den Bezug zu longest, bzw. line.

Vielleicht stehe ich mir auch nur selber auf dem Schlauch :-)


Bitte helft mir.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
27.10.2008, 13:32 Uhr
ao

(Operator)



C++:
void copy (char to[], char from[])
{
    int i;
    
    i=0;
    while ((to[i] =from [i]) != '\0')  // <<--- Hier
        ++i;
}


Hier wird kopiert (von from nach to) und gleichzeitig geprüft, ob es der Sentinel war. Dabei wird ausgenutzt, dass in C eine Zuweisung (to[i] = from[i]) nicht nur ein Statement ist, sondern auch einen abfragbaren Wert (sog. "rvalue") hat, nämlich den, der zugewiesen wird.

Ich schreib das Ganze mal etwas um, vielleicht wirds dadurch einfacher.:

C++:
void copy (char to[], char from[])
{
    int i = 0;
    while (from[i] != '\0') //  Wiederholen bis zum Sentinel in from
    {
        to[i] = from[i];   // i-tes Zeichen kopieren
        ++i;           // Index hochzählen
    }
    to[i] = '\0';    // Am Ende Sentinel in to rein - im Gegensatz
                      // zu der Funktion oben wird hier der Sentinel
                      // nicht in der Schleife kopiert.
}

Dieser Post wurde am 27.10.2008 um 13:33 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
28.10.2008, 09:10 Uhr
Thomas_C



Also, so richtig weitergebracht hat mich das noch nicht. Die Funktionsweise der einzelnen Funktionen sind nicht mein Problem. Mein Problem sind die Variablen. Ich häng mal folgenden Code an und schreibe mal dazu, was ich Aufgrund von meinem Problem erwartet hätte:


C++:
#include <stdio.h>

int test1(int, int);
void copy(int longest, int line);

main()
{
    int testa;
    int testb;
    int longest;
    int line;
    
    testa=3;
    testb=4;
    longest=5;
    line=7;
    
    printf("Test1 ist die Berechnung aus 3*4: %d\n\n",test1(testa,testb));
    copy(longest, line);
    printf("Mal sehen: %d\n\n", longest);
    
}

int test1(int a,int b)
{
    int resulta;
    
    resulta=a*b;
    
    return resulta;
}

void copy(int to, int from)
{
    to=to*from;
    printf("In COPY ergibt die Berechnung: %d\n\n",to);
}


Ich habe extra eine Funktion mit dem Namen Copy und den Variablen longest und line gewählt, damit hier eine Ähnlichkeit zu dem ersten Code besteht.
Ich übergeb hier doch genauso wie im ersten Code die Variablen longest und line an die Funktion Copy.
In Copy werden die Variablen an to(entspricht longest) und from(entspricht line) übergeben.
Der Wert für to wird neu berechnet.
Das Ergebnis wird als Kontrolle zuächst mir printf ausgegeben, alles oK.

In Main ist jetzt aber noch ein printf mit der Variablen longest, ähnlich wie in dem ersten Code, hier steht aber dann immernoch die 5 und nicht die 35 von der Variablen to aus der Funktion copy.

Ich hoffe, dass jemand mein Problem nachvollziehen kann. Wie gesagt, ich weiss nicht wo ich verloren gegangen bin, aber eure Hilfe ist wichtig für mich.


Vielen Dank.

Ich weiß cih steh auf dem Shclauch, kann aber leider nicht hochspringen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: