Variables Einlesen von Parametern

Hallo zusammen,
ich versuche zurzeit in einem C-Programm drei Parameter einzulesen, welche durch einen vorherigen Parameter benannt wird.
ich habe bereits versucht die Variablen in einem If-else Block zuzuweisen habe aber mit dem vergleich auf den vorigen Parameter Probleme, weil ich nicht weiß wie ich das am besten machen kann.

ich rufe das Programm mit /programm -a para1 -b para2 -c para3 auf.

es soll die Reihenfolge einfach beliebig sein d.h. para 3 darf auch mal vorne stehen, aber halt nur in kombination mit -c dann.


Gruß Daniel
 
versuch mal die Parameter der Reihe nach zu "identifizieren", wenn z.B.
Code:
argv[1] == "-a"
dann weißt du, dass argv[2] den ersten Parameter bezeichnet.
Ist argv[1] nicht "-a", dann prüfst du, ob es mit "-b" übereinstimmt (dann weißt du, dass argv[2] den anderen Parameter bezeichnet).
Passt das auch nicht, dann prüfst du noch mal "-c" und wenn das auch nicht stimmt, kannst du eine Fehlermeldung ausgeben lassen.
Hast du den ersten Parameter (bestehend aus argv[1] und argv[2]) abgearbeitet, dann machst du mit dem nächsten (argv[3] und argv[4]) das selbe noch mal, bis du alles abgearbeitet hast.
 
ich habe bereits versucht die einzelnen vorgeschriebenen Parameterbezeichnungen so zu vergleichen mit if(argv=="-a") dies hat aber nicht funktioniert, weil der das "-a" komischerweise nicht verglichen hat.



@CDW Es sind nur Standardimplementierungen des Systems erlaubt.
 
so ich denke der vergleich klappt jetzt.
ich poste mal meinen code, weil ich mal wieder einen Speicherzugriffsfehler habe...



Code:
#include <stdlib.h>


int main(int argc, char argv[])
	{
	
	  
	int i;
	int gesSpeicher;
	int schrittGroesse;
	int taktLaenge;
	int j;	
	int* speicher;
	
	char first[3],second[3],third[3];
	first[1]=second[1]=third[1]="-";
	 first[2]="M";
	 second[2]="S";
	 third[2]="T";
	 taktLaenge=3;
	 i=1;
	 
	 while(j<=6)
	 {
	    if(strcmp(argv[i],first,2))gesSpeicher=argv[i+1];
	    else if(strcmp(argv[i],second,2))schrittGroesse=argv[i+1];
	    else if(strcmp(argv[i],third,2))taktLaenge=argv[i+1];
	  j+=j+2;
	  i++;
	} 
		 
	printf("PID von memalloc: %d\n", getpid());
	
	i=(gesSpeicher/schrittGroesse);
	printf("%d\n",i);
	speicher=malloc(schrittGroesse);
	
	free(speicher);
return 0;
	}

was kann der fehler sein?
ich denke mal bestimmt wieder beim memalloc
 
gcc -Wall -Wextra -Wstrict-prototypes -Wpointer-arith -Wcast-qual -pedantic -std=c99 -O1
Code:
err.c:2:5: warning: second argument of 'main' should be 'char **' [-Wmain]
err.c: In function 'main':
err.c:20:29: warning: assignment makes integer from pointer without a cast [enabled by default]
err.c:21:11: warning: assignment makes integer from pointer without a cast [enabled by default]
err.c:22:12: warning: assignment makes integer from pointer without a cast [enabled by default]
err.c:23:11: warning: assignment makes integer from pointer without a cast [enabled by default]
err.c:29:6: warning: implicit declaration of function 'strcmp' [-Wimplicit-function-declaration]
err.c:36:2: warning: implicit declaration of function 'printf' [-Wimplicit-function-declaration]
err.c:36:2: warning: incompatible implicit declaration of built-in function 'printf' [enabled by default]
err.c:36:2: warning: implicit declaration of function 'getpid' [-Wimplicit-function-declaration]
err.c:15:6: warning: variable 'taktLaenge' set but not used [-Wunused-but-set-variable]
err.c:2:14: warning: unused parameter 'argc' [-Wunused-parameter]
err.c:40:3: warning: 'schrittGroesse' may be used uninitialized in this function [-Wmaybe-uninitialized]
err.c:40:3: warning: 'gesSpeicher' may be used uninitialized in this function [-Wmaybe-uninitialized]
err.c:34:5: warning: 'j' may be used uninitialized in this function [-Wmaybe-uninitialized]
Es reicht eigentlich schon, die Warnungen bei -Wall -Wextra zu berücksichtigen. Weiterhin kann ein Debugger sehr sehr hilfreich sein.

Es fehlen:
Code:
#include <stdio.h>
#include <string.h>

Dann:
Code:
int main(int argc, char argv[]) => char *argv[]
Code:
first[1]=second[1]=third[1]="-";
first[1]=...="-" => sicher, dass hier least significant byte (footnote0) des Pointers zum "-" String als Wert gesetzt werden soll? Oder doch eher '-'?
Das gleiche für:
Code:
	 first[2]="M";
	 second[2]="S";
	 third[2]="T";
Und was ist mit dem [0] Wert - der ist bei allen drei undefiniert?
Code:
while(j<=6)
Wert von j ist undefiniert.

Code:
 if(strcmp(argv[i],first,2))gesSpeicher=argv[i+1];
strcmp mit 3 Paramtern => strncmp
Wenn die Strings übereinstimmen (was sie in den meisten Fällen nicht tun werden, da first[0] undefiniert ist), wird nichts getan - da strncmp bei einer Übereinstimmung 0 zurückgibt (also eher if(strncmp(foo,bar,x)==0) then schreiben). Ansonsten bekommt gesSpeicher die Adresse zum i+1 Argument, was wohl kaum so gemeint sein wird.
Das gleiche gilt für die restlichen 2 Abfragen/Zuweisungen.

Code:
i=(gesSpeicher/schrittGroesse);
Der Wert von gesSpeicher und schrittGröße ist entweder komplett undefiniert und es sind Speicheradressen zu den jeweiligen Arg-Strings.
Code:
speicher=malloc([s]schrittGroesse[/s] irgendein Wert, der bei 64-Bit Programmen sehr sehr groß sein kann);

[0] Pi*Daumen. Zumindest bei den üblichen Compilern und Rechnerarchitekturen - wie das nun genau defniert ist (und ob überhaupt) darf der Interessierte gerne selbst nachschlagen ;)
 
hey CDW und alle anderen,
danke das ihr mir so fleißig helft auch wenn ich blöde Fehler öfter mache.
ein Paar von den genannten Problemen hatte ich vorher schon bemerkt und behoben.
hab alles andere was du angemerkt hast auch versucht weitesgehend zu beheben.
ich komme aber nicht weiter bei der Umwandlung des Strings in argv[] in einen integer-Wert um ihn dann abzuspeichern.

Wie kann ich das am besten machen?
casts habe ich schon probiert und auch verschiedene Möglichkeiten der Zuweisung.

nochmals Danke
 
Dann bitte mal den neuen Code posten ;)
ich komme aber nicht weiter bei der Umwandlung des Strings in argv[] in einen integer-Wert um ihn dann abzuspeichern.
Wie kann ich das am besten machen?
casts habe ich schon probiert und auch verschiedene Möglichkeiten der Zuweisung.
Einfach nur casten wird nicht funktionieren.
Entweder atol oder strol
c Programming/C Reference/stdlib.h/strtol - Wikibooks, open books for an open world
strtol() Usage Guide | Miloslav Trma
nutzen (beim letzteren kann man eine Basis angeben und bekommt zudem eine Fehlermeldung zurück).
 
Ich habe auch schon das atoieingebaut und es wird immer besser. ich freu mich!


der code:

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

int main(int argc, char **argv)
	{
	
	  
	int i;
	int gesSpeicher;
	int schrittGroesse;
	int taktLaenge;
	int j;	
	int* speicher;
	
	char first[2],second[2],third[2];
	first[0]=second[0]=third[0]='-';
	 first[1]='M';
	 second[1]='S';
	 third[1]='T';
	 taktLaenge=3;
	 i=1;
	 j=1;
	 int vgl;
	 
	 while(j<=7)
	 {
	   vgl=strncmp(argv[i],first,2);
	   printf("vgl1:%d\n",vgl);
	    if(vgl==0)gesSpeicher=atol(argv[i+1]);
	    vgl=strncmp(argv[i],second,2);
	    printf("vgl2:%d\n",vgl);
	    if(vgl==0)schrittGroesse=atol(argv[i+1]);
	    vgl=strncmp(argv[i],third,2);
	    printf("vgl3:%d\n",vgl);
	    if(vgl==0)taktLaenge=atol(argv[i+1]);
	    printf("j :%d i: %d \n" ,j,i);
	  j=j+2;
	    //j++;
	    i++;
	} 
	printf("%d	%d	%d	\n",gesSpeicher, schrittGroesse, taktLaenge); 
	printf("PID von memalloc: %d\n", getpid());
	
	i=(gesSpeicher/schrittGroesse);
	printf("%d\n",i);
	speicher=malloc(schrittGroesse);
	
	free(speicher);
return 0;
	}

bei mir ändert er nun die ersten beiden, geht aber nicht in den letzten Parameter für -T
 
Ich habe jetzt ein bisschen aufgeräumt und kommentiert und hoffe es ist nun besser zu lesen.

meine Frage die ich nun habe ist,
kann ich den Speicher in einem bestimmten Zeitintervall(angabe -T in sec) anlegen?
(in java durch Threads ja z.b möglich)
Die Speicheranlegungn soll in einer Endlosschleife laufen und mit crtl+c beendet werden.
Aber wie kann ich dann noch den Speicher wieder free() machen und so?
der Code sieht nun folgender maßen aus:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void usage(void)
{
    printf("Parametereingabe wie folgt:\n");
    printf(" ./memalloc -M <byte> -S <byte> [-T <byte>]");
}

int main(int argc, char **argv)
	{
	
	  //Initialisierung 
	int i, vgl, bool1, bool2, lastSpeicher;
	int gesSpeicher, schrittGroesse, taktLaenge;
	int* speicher;
	char first[2],second[2],third[2];
	
	  //Deklaration
	 first[0]=second[0]=third[0]='-';
	 first[1]='M';
	 second[1]='S';
	 third[1]='T';
	 
	 taktLaenge=3;
	 i=1;
	 bool1=bool2=0;
	 
	 //Variable Wertzuweisung der Parametereingabe
	 for(i=1;i<argc;i++)
	 { 
	    vgl=strncmp(argv[i],first,2);
		printf("vgl1:%d\n",vgl);
	    if(vgl==0)
	    {
	      gesSpeicher=atol(argv[i+1]);
	      bool1=1;
	    }
	    
	    vgl=strncmp(argv[i],second,2);
		printf("vgl2:%d\n",vgl);
	    if(vgl==0)
	    {
	      schrittGroesse=atol(argv[i+1]);
	      bool2=1;
	    }
	    
	    vgl=strncmp(argv[i],third,2);
		printf("vgl3:%d\n",vgl);
	    if(vgl==0)
	    {
	      taktLaenge=atol(argv[i+1]);
	      //Defaultwert ist bereits 3
	    }
	}
	
	//Abfrage ob alle Werte gesetzt sind
	if(bool1==0  || bool2==0)
	{
	  usage();
	  return -1;
	}
	
	printf("%d	%d	%d	\n",gesSpeicher, schrittGroesse, taktLaenge); 
	
	//Ausgbae der PID
	printf("PID von memalloc: %d\n", getpid());
	
	//Vorberechnungen
	i=(gesSpeicher/schrittGroesse);
	lastSpeicher=gesSpeicher-(schrittGroesse*i);
	printf("%d\n",i);
	
	//Dynamisches Anlegen von Speicher
	while(1)
	{
	  if(i>0)
	  {
	    speicher=realloc(speicher,schrittGroesse);
	  }
	  i--;
	  speicher=realloc(speicher,lastSpeicher);
	  
	}
	
	free(speicher);
return 0;
	}

Danke für eure Hilfe!

habe mittlerweile weiter rumprobiert und auch versucht zwei Zeiten zu vergleichen die ich mit clock() bekommen habe,aber das funktioniert leider nicht -.-
 
Zuletzt bearbeitet:
hallo zusammen,

ich bin mittlerweile bei einer Variante mit sleep() angekommen.
hier der relevante code:
Code:
//Vorberechnungen
	i=(gesSpeicher/schrittGroesse);
	lastSpeicher=gesSpeicher-(schrittGroesse*i);
	printf("%d\n",i);
	
	//Dynamisches Anlegen von Speicher
	
	while(i)
	{
	    sleep(taktLaenge);
	    if(i>0)
	    {
	      speicher=realloc(speicher,schrittGroesse);
	    }
	    else if(i==0)
	    {
	      speicher=realloc(speicher,lastSpeicher);
	    }
	  
	  i++;
	}
	
	free(speicher);

das programm wird kompiliert aber beim ausführen bekomme ich einen Fehler
bzw. wird abgebrochen mit der Begründung :Speicherabzug geschrieben.

P.S. Wie kann ich den Befehl ctrl+c im Programm definieren?
 
Zurück
Oben