Computer Hardware Forum - TweakPC

Computer Hardware Forum - TweakPC (https://www.tweakpc.de/forum/)
-   Programmiersprachen (https://www.tweakpc.de/forum/programmiersprachen/)
-   -   Array an main() senden in C (https://www.tweakpc.de/forum/programmiersprachen/28836-array-an-main-senden-in-c.html)

Daiquiri 13.10.2005 14:32

Array an main() senden in C
 
Moin!
eine kleine Frage die mich hier fast zum durchdrehen bringt:

In meinem Unterprogramm wird ein Array erzeugt. Dieses soll an das main Programm gesendet werden um es dort auszugeben! Wie geht das, ich probiere und lese schon Stunden! Ich lese immer nur Pointer, String, Array, Parameter, aber das ergibt alles keinen Sinn!
Hat nicht jem. ein ganz einfaches Beispiel wie das geht?
Nur ein Array vom Unter ins Main Programm?!?!?!?
Ich bedanke mich jetzt schon mal ... Danke

Stefan 13.10.2005 15:21

AW: Array an main() senden in C
 
vielleicht das array in ne variable abspeichern und die dann im hauptprogramm abrufen ?

smoek 13.10.2005 17:30

AW: Array an main() senden in C
 
was meinst du genau mit Unterprogramm? meinst du damit andere Funktionen ?

Ich weiss ja nicht wie komplex du das aufgebaut hast.. ich geh mal von nicht sehr komplex aus, da du ja noch Einsteiger bist.
Die main() wird als erstes ausgeführt und parameterübergrabe dürfte wohl nur durchin der kommandozeile gehen. Anders die anderen Funktionen, die kannst du (zB von der main() aus) aufrufen, und die können mittels return Werte zurückgeben.
Vor der main() kommt nix, also kannst du auch nichts "an die main() übergeben".

So gut kenn ich mich in C zwar nich aus.. aber so Elementarzeugs sollte ich eigentlich können.. müsste schon stimmen

BTW: in C(++) ergibt vieles keinen Sinn :mrgreen: wenn du was logisches suchst, nimm Java :)

stebbi

kerri 13.10.2005 18:08

AW: Array an main() senden in C
 
[QUOTE=smoek][...]
Vor der main() kommt nix, also kannst du auch nichts "an die main() übergeben".[...][/QUOTE]

Um, natuerlich kann man der Main was uebergeben, wenn auch nicht in dem Sinne, in dem es hier vonnoeten waere ;) Jedoch kann man der Main nur Kommandozeilenargumente direkt beim Start uebergeben. Aber das ist fuer das Problem hier voellig unerheblich, ich versuch mal, nen moeglichen Loesungsweg zu erklaeren.

Die Herangehensweise ist verkehrtrum, dreht man die um, klappts auch :) Das meine ich so: Nicht die Funktion etwas an main() zurueckgeben lassen, aber die main() der Funktion ein leeres Array uebergeben, die dann damit allerhand anstellen kann, z.B. auch Werte da hineinlegen.

Bei Arrays ist die Uebergabe aber leider nicht ganz so einfach, da muss man leider einen Ausflug zu Pointern machen. Ein Array zeichnet sich durch drei grundlegende Eigenschaften aus: der Datentyp (int, float,...) der Elemente, die Adresse des ersten Elements (array[0]) und die Laenge des Arrays. So kann jedes Element des Arrays gefunden werden.

Was Du nun willst, ist, in der main() ein Array der benoetigten Laenge zu erzeugen, und der Unterfunktion sagen, das sie die Werte genau dahin speichern soll. Um das zu Bewerkstelligen, brauchst Du die Speicherposition (=Adresse) des Arrays. Fragen kannst du das erste Element, wo es gespeichert ist, mit & vor dem namen, also etwa &alle_meine_Entchen[0] liefert die Speicheradresse des ersten Elements zurueck. Diese Speicheradressen duerften in etwa so aussehen: 0x89cbd30.

Damit kannst Du natuerlich nicht viel Anfangen, aber die Unterfunktion koennte es. Dazu muss sie aber wissen, das sie eine Adresse beim Aufruf uebergeben bekommt, und keine einfache Zahl. Variablen, in denen Adressen gespeichert werden, initialisiert man daher mit einem vorgestellten Sternchen. Zum Beispiel int *gelbes_entchen; kann eine Adresse speichern, an der eine Integer Zahl liegt. gelbes_entchen ist dann einer dieser ominoesen Pointer - er 'zeigt' auf eine Zahl.

Die Unterfunktion muesstest du also so bauen, das sie einen Pointer uebernimmt, und die Main so, das sie der Unterfunktion eine Adresse uebergibt. Kleines Beispiel zur Veranschaulichung:

[code]

int main ()
{
int i;
int MeinArray[42];

printf("Unbearbeitet: "); // das unbearbeitete Array ausgeben
for (i=0;i<42;i++)
{
printf("%d ",MeinArray[i]);
}
printf("\n");

meinefunktion(&MeinArray[0]); // Funktion aufrufen und Adresse des ersten Elements uebergeben

printf("Bearbeitet: "); // das bearbeitete Array ausgeben
for (i=0;i<42;i++)
{
printf("%d ",MeinArray[i]);
}
printf("\n");

return 0;
}

void meinefunktion(int *pMeinArray) // Adresse des ersten Arrayelements entgegennehmen
{
int i;

for (i=0;i<42;i++)
{
pMeinArray[i] = 42 * 23; // das Array belegen
}
}
[/code]


Was passiert hier: in main() wird ein Array erzeugt, der Funktion meinefunktion() wird gesagt, sie soll da hineinschreiben, und das Array, was eigentlich main() 'gehoert' veraendern. Noch was zur Namensgebung, Du kannst natuerlich einen pointer (nach C Namenskonvention) beliebig benamsen, als der im Beispiel muesste nicht unbedingt pMeinArray heissen, er koennte z.B. auch hintertupfingen heissen - ist aber nicht wirklich praktisch, denn so fehlt jede Zuordnung zum Zweck des Pointers. Pointer mit pName zu benamsen ist recht weit verbreitet.

So, eine Kleinigkeit gibts aber noch zu sagen, bei Arrays gibts noch was ganz praktisches, der Name des Arrays liefert gleichzeitig die Adresse des ersten Elements, also es gilt: MeinArray == &MeinArray[0] Ist natuerlich nun maximal verwirrend, mal mit & und mal ohne, aber das ist einfach nur ne Gewoehnungs/Faulheitsfrage.


Gruesse, kerri

PS.; Ich hoffe, das zusammengeschusterte Proggie oben tut, was es soll, getestet hab ichs nicht ;)

tele 13.10.2005 22:39

AW: Array an main() senden in C
 
wieso nicht einfach das array als rückgabewert der funktion nehmen? ich meine wenn die funktionsweise von parametern und return werten noch nicht klar ist, finde ich pointer etwas übertrieben

kerri 13.10.2005 22:41

AW: Array an main() senden in C
 
Wenn ich mich recht erinnere, geht genau das in C nicht, deshalb diese ganzen Verbiegungen - ich lass mich aber gerne eines besseren belehren.

Gruesse, kerri

Daiquiri 14.10.2005 07:50

AW: Array an main() senden in C
 
WOW, DANKE kerri !!!!
Das ist genau das was ich gesucht habe! Und es funktioniert sogar! Wobei ich daran eigentlich keinen Zweifel hatte!

Wenn ich schon dabei bin, noch ne andere Frage:

Kann ich ein Array ohne weiters auf Gleichheit prüfen?
z.B.:

char array[] = "hallo";

if (array == hallo) { ... };

Das ist jetzt mal ganz simpel dargestellt! Ich könnte wetten dafür muß ich etwas mehr tun!?!

Bis die Tage und ein fantastiggerisches Wohenende

kerri 14.10.2005 08:59

AW: Array an main() senden in C
 
[QUOTE=Daiquiri][...]
Kann ich ein Array ohne weiters auf Gleichheit prüfen?
z.B.:

char array[] = "hallo";

if (array == hallo) { ... };

Das ist jetzt mal ganz simpel dargestellt! Ich könnte wetten dafür muß ich etwas mehr tun!?!
[...][/QUOTE]

Wie Du schon richtig vermutest, ist das nicht soooo einfach. Fuer Zahlenarrays muesstest Du eine for-Schleife darumbauen, die die arrays elementweise vergleicht. Das geht natuerlich nicht fuer Buchstabenketten, deren Laenge Du nicht kennst. Das geht am einfachsten, indem Du <string.h> includest. Da drin stehen einige Funktionen mit denen man allerlei Spass mit Zeichenketten anstellen kann, unter anderem eben auch Vergleiche. Das geht dann mittels strcmp (=STRingCoMParison):

[code]
#include <stdio.h>
#include <string.h>

int main()
{
char array[] = "hallo";

if ( strcmp (array, "hallo") == 0)
{
printf("yesssss\n");
}
else
{
printf("arrrrrrgh\n");
}

return 0;
}
[/code]

srtcmp liefert 0 zurueck, wenn beide Strings gleich sind, Werte verscheiden von 0, wenn sich die Strings unterscheiden. Was man mit string.h sonst noch alles machen kann, ist [url=http://www.mindrup.de/atos/news/c-kurs-10.html#string]hier aufgelistet[/url].

Gruesse, kerri

Daiquiri 14.10.2005 10:33

AW: Array an main() senden in C
 
Das ist ne gute Idee von dir!

Leider Arbeite ich hier mit MPLab und dem CX5x Compiler, da gibt es keine "string.h".

Aber ich schaue mal nach ob ich sowas im www finden kann.

Grüße
Matthias

kerri 14.10.2005 11:05

AW: Array an main() senden in C
 
Hmmm.... also man koennte den Vegleich auch von Hand machen, also Element fuer Element - ist aber, wie gesagt, das Problem der unbekannten Laenge - das laesst sich aber abfangen.

Diese Strings (char []) haben am Ende immer das Zeichen '\0' (wird als ein Zeichen gewertet, wie '\n'). Also ein String char MeinString[]="hallo" wird so in einzelne Zeichen zerlegt und im Array gespeichert: 'h', 'a', 'l', 'l', 'o', '\0' Also waere es moeglich, eine while-Schleife zu konstruieren, die, sobald sie das Zeichen '\0' findet, abbricht, etwa so:

[code]
int i=0;
char MeinArray[] = "hallo";
char AnderesArray[] = "auch hallo";

while (MeinArray[i] != '\0' || AnderesArray[i] != '\0') // Abbruch wenn Stringende eines Arrays gefunden
{
if (verglArr[i]!=array[i])
{
printf ("aaaaaargh!\n");
printf ("Zeichen %d: %c != %c", i, MeinArray[i], AnderesArray[i]);
break; // Schleifen-Abbruch bei Ungleichheit
}
i++; // zaehlvariable eins hochzaehlen
}
[/code]

Faengt allerdings noch nicht ab, das die Strings untershiedlich lang sein koennten, also "hallo" und "hallodriho" wuerden als gleich gewertet, muesste man eventuell noch einbauen: Einfach per while die solange den String durchgehen, bis '\0' gefunden wird, dabei die Anzahl der Zeichen zaehlen, das fuer jeden String machen, und die beiden Ergebnisse vergleichen.

Gruesse, kerri

smoek 14.10.2005 15:21

AW: Array an main() senden in C
 
@kerri:

[QUOTE=smoek]Die main() wird als erstes ausgeführt und parameterübergrabe dürfte wohl nur durchin der kommandozeile gehen. [/quote]
(Abgesehen von dem Rechtschreibfehler da drin.. ;))

aber bei dem was du da geschrieben hast steig ich nich mehr durch.. Oo

stebbi

kerri 14.10.2005 15:29

AW: Array an main() senden in C
 
[QUOTE=smoek]@kerri:


(Abgesehen von dem Rechtschreibfehler da drin.. ;))

aber bei dem was du da geschrieben hast steig ich nich mehr durch.. Oo

stebbi[/QUOTE]

Argl, sorry, da hab ich malwieder nur die Haelfte gelesen ;)

Ist aber auch nicht wirklich einfach, das Thema. Das muss man ein paar mal gemacht haben, dann erscheints einem voellig natuerlich, wenn auch nicht unbedingt logisch ;)

Gruesse, kerri

Sur3 25.01.2011 16:24

AW: Array an main() senden in C
 
[QUOTE=kerri;297754]
[code]
int i=0;
char MeinArray[] = "hallo";
char AnderesArray[] = "auch hallo";

while (MeinArray[i] != '\0' || AnderesArray[i] != '\0') // Abbruch wenn Stringende eines Arrays gefunden
{
if (verglArr[i]!=array[i])
{
printf ("aaaaaargh!\n");
printf ("Zeichen %d: %c != %c", i, MeinArray[i], AnderesArray[i]);
break; // Schleifen-Abbruch bei Ungleichheit
}
i++; // zaehlvariable eins hochzaehlen
}
[/code]

Faengt allerdings noch nicht ab, das die Strings untershiedlich lang sein koennten[/QUOTE]
Dann mach aus dem while ein do...while. ;)

PS:
Sry fürs Karteileichenschänden :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:19 Uhr.

Powered by vBulletin® Version 3.8.10 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
SEO by vBSEO 3.5.2 ©2010, Crawlability, Inc.