Odczytywanie argumentów z funkcji main.

Odczytywanie argumentów z funkcji main.
DD
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 9 lat
  • Postów:7
0

Witam mam program kalkulator bitowy który pobiera wartości argumentów funkcji main. Niestety podczas odpalania na ubuntu mam bład: "[1]+ Naruszenie ochrony pamięci (zrzut pamięci) ./a.out 100 220". Program odpalam w terminalu "gcc nazwa.c" następnie "./a.out 100 220 &". Może mi ktoś wyjaśnić dlaczego tak sie dzieje ?

Kopiuj
 
#include<stdio.h>
#include<stdlib.h>

int zamiana(int x);
int main(int argc, char **argv)
{
int a,b,c;
a = atoi(argv[1]);
b = atoi(argv[2]);
printf("twoja pierwsza liczba to: %d\n",a);
zamiana(a);
printf("Twoja druga liczba to: %d\n",b);
zamiana(b);
switch(argv[3][0])
{
case '~':
{
a=(~a);
b=(~b);
zamiana(a);
zamiana(b);
break;
}
case '&':
{
c=a&b;
zamiana(c);
break;
}
case '|':
{
c=a|b;
zamiana(c);
break;
}
case '^':
{
c=a^b;
zamiana(c);
break;
}
default:
{
printf("podales zly operator\n");
break;
}
}
return 0;
}

int zamiana(int x)
{
	int i;
	char tab[32];
	printf("Twoja liczba po zamianie na bity to: ");
	for (i = 31; i >= 0; i--)
	{
	tab[i] = ((x >> i) & 1);
	printf("%d", tab[i]);
	}
	printf("\n");
}
Gynvael Coldwind
  • Rejestracja:ponad 21 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Zurich, Switzerland
  • Postów:457
2
Kopiuj
Problem jest dość zabawny, mianowicie &, | oraz ~ to specjalne znaki w Bashu:
& - uruchomienie procesu w tle
| - przekierowanie standardowego wyjścia aplikacji na standardowe wyjście kolejnej aplikacji
~ - katalog domowy

Więc jak uruchamiasz ./a.out 100 200 &, to dla Basha znaczy ./a.out 100 200 uruchomione w tle (jak widzisz trzeci parametr znikł). Aplikacja dostaje więc jedynie dwa parametry i przy switch(argv[3][0]) leci wspomniany przez Ciebie błąd.

Wystarczy, że "wyescapujesz" ten parametr podczas uruchomienia i wszystko będzie OK, tzn:
./a.out 100 200 \&
albo
./a.out 100 200 '&'
(analogicznie z pozostałymi znakami)

Dodam, że pod Windowsem jest podobnie, ale nie ma potrzeby escape'owania ~. Ale, znakiem ucieczki jest tam ^ a nie \, więc będzie to ^&, ^| lub ^^ ;)

peace,
gynvael.coldwind//vx "Imagination is more important than knowledge..." Albert Einstein
edytowany 1x, ostatnio: Gynvael Coldwind
mad_penguin
mad_penguin
Coś się nie tak sformatowało w ostatniej linijce ;)
Gynvael Coldwind
Ups. Chyba powinienem wyescapeować znak od escapowania, badum tsss... Fixed ;)
DD
dzięki za pomoc :) Nie wiedziałem że Bash uznaje &,~,| jako znaki specjalne.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
1
  1. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. Nie używaj bezmyślnie postinkrementacji oraz postdekrementacji również: http://4programmers.net/Forum/1101404
  3. Nie sprawdzasz czy podano trzy argumenty
  4. Powiedz którego słowa nie zrozumiałeś w tym http://4programmers.net/Forum/1209589 poście?

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
MY
  • Rejestracja:ponad 9 lat
  • Ostatnio:8 dni
  • Postów:1083
1

@_13th_Dragon ja bym dodał do tego kolejny punkt.

  • Nie użyłeś debuggera.

Żeby kolega uruchomił program pod debuggerem natychmiast by było jasne co jest nie tak.

MarekR22
debugger by tu nie pomógł bo problem pojawia się jeszcze przed uruchomieniem, ale w ogólnym przypadku zgadzam się, umiejętność posługiwania się debuggerem jest ważniejsza nawet niż znajomość składni języka.
MY
@MarekR22 pomógłby. Naruszenie pamięci jak dla mnie następuje podczas switch(argv[3][0]) Jak nie mamy przekazanego 3 parametru do programu. Debugger pokazałby w której linii następuje naruszenie pamięci.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.