Not logged in. · Lost password · Register

Page:  1  2  next 
ingonör
Member since May 2013
67 posts
Subject: Aufgabe 7 Argumente speichern
Hallo,

ich würde gerne in einer Funktion
void readArgs(char *buf, char *args) {...};
Eine Eingabe, z.B. "testprogramm arg1 arg2", welche in buf steht folgendermaßen abspeichern:
args[0] = "testprogramm"
args[1] = "arg1"
args[2] = "arg2"

Das Zerlegen der Eingabe mit strtok funktioniert bei mir problemlos. Doch bei mir scheitert das Abspeichern des Rückgabewertes von strktok (hier: strPtr).
args[arg_count++] = strPtr;
Diese Zeile wird nicht kompiliert, da es sich plötzlich um ein int-Array handeln soll.
Ich habe zu Testzwecken mal sowas geschrieben:
args[0] = 'a';
args[1] = 'b';

Wenn ich mir dann in der main den Inhalt von args[0] ausgeben lasse, bekomme ich 97 zurück, was dem ASCII-Code von 'a' entspricht.
Ich verstehe das nicht. Wo ist da der Fehler?
Mein Ziel ist es, ein char Array in der main zu erstellen, dieses an eine Funktion zu übergeben, wo es verändert wird, um dann mit dem geänderten Array in der main weiter zu arbeiten.
Vielen Dank für die Hilfe!

Grüße
ingonör
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
args ist ein pointer auf ein char. Du willst aber ein array von char pointern.
Am besten mal auf malen. Ist etwas schwer das in Textform hinzuschreiben.
Raim
GSPiC-Guru
Member since May 2011
79 posts
Im Foliensatz zur Übung war an dieser Stelle ein Fehler. Auf Folie 8 soll natürlich ein char *args[4]; deklariert werden. Die korrigierte Version ist jetzt online.
bem
Member since Apr 2011
21 posts
Hm, strtok ist doch für sowas schon mit Atombomben auf Kolibris geworfen ;)
Ich hab sowas letztens mal für einen UART-Parser auf nem AVR gebraucht und mir deswegen die folgende Funktion geschrieben:

static uint8_t splitArgs(char *data, char **argv, uint8_t maxArgc){
   
    uint8_t argc = 0;
    char *pos = data;

    do {
       
        while(isspace(*pos)){
            pos++;
        }
       
        if(*pos != 0){
            argv[argc++] = pos;
        } else {
            argv[argc] = 0;
            break;
        }

        while(*pos != 0 && !isspace(*pos)){
            pos++;
        }

        if(*pos != 0 && maxArgc > 1){
            *pos++ = 0;
        }
       
    } while (--maxArgc);

    return argc;
}

dürfte wohl genau das machen, was du brauchst - aber Vorsicht, der Originalstring wird verändert, wenn du ihn später nochmal brauchen solltest, musst du dir vor dem Aufruf eine Kopie anlegen.

HTH
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
Quote by bem:
Hm, strtok ist doch für sowas schon mit Atombomben auf Kolibris geworfen ;)
Eigentlich nicht. Es ist für genau den Zweck gedacht - Eine Zeichenkette zu zerteilen. Zumal du in der Klausur wahrscheinlich nicht noch schnell deine eigene Funktion auf das Papier bringen willst, auch wenn das ok ist - gibt halt keine Punkte.
bem
Member since Apr 2011
21 posts
Quote by morty:
Zumal du in der Klausur wahrscheinlich nicht noch schnell deine eigene Funktion auf das Papier bringen willst

Die ist schon 2 Jahre vorbei.
Aber geht es hier[TM] nicht um GSPiC und war GSPiC nicht AVR-Programmierung?
Ich jedenfalls vermeide meistens auf so kleinen Controllern die Verwendung der string.h oder Sachen wie printf, weil man eh fast immer nur Bruchstücke der Funktionalität benötigt.
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
Ne, in dem Fall ist es SPiC (ohne G) und da muss man auch noch ein wenig POSIX programmieren.
ingonör
Member since May 2013
67 posts
Eine Frage noch zu folgendem Punkt in der Aufgabenstellung:
lish > sleep 10
Signal [ sleep 10 ] = 2

Hier wurde ja anscheinend das Signal CTRL + C gesendet. Eigentlich prüfe ich ja in meinem Elternprozess,
if(WIFSIGNALED(stbits)) { .. }
ob ein Signal gesendet worden ist. Trotzdem lande ich beim Drücken von CTRL + C wieder in der bash. Laut Aufgabenstellung muss das ja nicht abgefangen werden. Aber wieso wird dann das obige Beispiel in der Aufgabenstellung erwähnt? Muss es nun doch so implementiert werden, dass man nach Drücken von CTRL + C während des Kindprozesses wieder in der lish landet?

Grüße
ingonör
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
Das Problem ist, dass du, wenn du STRG-C drückst, das sowohl an die lish als auch sleep geschickt wird. Einfacher ist es eine zweite Konsole aufzumachen und spic-wait zu verwenden. Oder in der zweiten konsole killall sleep aufzurufen - Das tötet dann alle sleeps, aber man braucht die PID nicht.
ingonör
Member since May 2013
67 posts
Verstehe.
Das spic-wait Programm ist doch dazu gedacht, zu prüfen, ob ein Signal an den Prozess gesendet worden ist oder nicht? Folgende Zeile wäre dann TRUE
if(WIFSIGNALED(stbits)) {...}
richtig?

Bei mir funktioniert das mit dem
kill PID
aber irgendwie nicht. Selbst wenn ich spic-wait von der bash aus ausführe, wird mir zwar die PID angezeigt, aber wenn ich dann
kill PID
eingebe (also bei PID steht natürlich die angezeigte PID in spic-wait), dann passiert aber gar nichts. Ich komme erst wieder zur bash, wenn ich CTRL + C drücke.
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
hast du ein zweites Fenster offen? Also
putty1: lish -> spic-wait
putty2: Ausgabe (kill....) von spic-wait eingaben.
Danach sollte spic-wait sich beenden.
ingonör
Member since May 2013
67 posts
Würde das gerne testen, aber ich komme gerade nicht auf die Uniserver. Putty sagt timed-out.
Sind die Server down?
Hase
Member since May 2013
13 posts
Nein, nicht generell, aber hin und wieder fällt ein einzelner Rechner mal aus. Probier mal einen anderen? faui00d.cs.fau.de geht bei mir zB
ingonör
Member since May 2013
67 posts
In reply to post #11
Quote by morty on 2013-06-28, 17:51:
hast du ein zweites Fenster offen? Also
putty1: lish -> spic-wait
putty2: Ausgabe (kill....) von spic-wait eingaben.
Danach sollte spic-wait sich beenden.

Also, wenn ich in meiner lish den Prozess spic-wait und dann kill aufrufe, sieht das folgendermaßen aus:

[Image: https://dl.dropboxusercontent.com/u/7261736/Foren/putty_7.jpg]

Es passiert einfach nichts. Ich komme da nur noch mit STRG + C raus und lande dann wieder in der bash.
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
Du musst mit Putty eine zweite Shell zu dem Server auf machen - Also putty ein zweites mal starten. Dann kannst du in der zweiten Shell kill -Quit 2150 eingeben.
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Special characters:
Page:  1  2  next 
Go to forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen