Program inaczej działa na linuxie i windowsie

0

Witam.
Nie będę oryginalny - wziąłem się za naukę C++, jednak już programowałem, więć totalnie zielony nie jetem ;) Chcę zrobić grę sudoku obsługiwaną w terminalu. Program piszę trochę na windowsie a trochę na linuxie:

  • na Windows 7 w DevCpp Portable 5.6.0;
  • na Ubuntu piszę w VIM-ie a kompiluję przez gcc komendą gcc -Wall -o -program program.cpp (nie wiem czy flagi nie mają znaczenia).
    Problem wygląda tak, że na Windowsie program działa dobrze a na Ubuntu już nie. Na początku program generuje tablicę 9x2. Pierwszy wiersz to kolejne liczby od 1 do 9. Drugi rząd jest losowany a później kolumny sortowane rosnąco według dolnego wiersza. Na windowsie działa prawidłowo. Na linuxie w pierwszym rzędzie nie ma cyfry 9 tylko jakaś ogromna liczba (na początku cała tablica jest zerowana). Poza tym przy każdym uruchomieniu programu w konsoli (./program) liczby są te same, na windowsie za każdym razem losuje je na nowo. Zacząłem okrajać program, żeby znaleźć przyczynę, jednak załamałem się, gdy przy kodzie:
 
int tablica[9];
for (i = 0; i<9; i++) tabica[i] = 0;
for (int i = 0; i<9; i++)
	{
		tablica[i] = i+1;
		printf("%i  ");
	}

otrzymuję wynik 92 92 92 92 92 92 92 92 92. Czy to może być przyczyna bibliotek? Zainstalowałem na Ubuntu CodeLite. Tutaj program się w ogóle nie włącza :/ Poniżej zamieszczam działającą część kodu:

#include <cstdio>
#include <cstdlib>
#include <ctime>

void segreguj(int tab1[9][2])
{	
	int tymczasowa1, tymczasowa2, tymczasowa3, tymczasowa4, kontrola;
	for (int j = 0; j < 2; j++)
	for (int i = 0; i < 9; i++) 
	tab1[i][j] = 3;
	
	for (int i = 0; i < 9; i++)
	{	
		tab1[i][0] = i+1;
		tab1[i][1] = (rand() % 100);
	}

	do
	{
	kontrola = 0;
	for (int i = 0; i < 9; i++)	
	{
	
		if (tab1[i][1] > tab1[i+1][1])
		{
			tymczasowa1 = tab1[i][1];
			tymczasowa2 = tab1[i+1][1];
			tab1[i][1] = tymczasowa2;
			tab1[i+1][1] = tymczasowa1;
			tymczasowa1 = tab1[i][0];
			tymczasowa2 = tab1[i+1][0];
			tab1[i][0] = tymczasowa2;
			tab1[i+1][0] = tymczasowa1;
			kontrola = 1;
		}
	}
	}
	while (kontrola == 1);
}




int main()
{
	int i;
	int tab1[9][2];
	segreguj(tab1);
	
	for (int i = 0; i<9; i++) printf("%i  ",tab1[i][0]);
	printf("\n");
	for (int i = 0; i<9; i++) printf("%i  ",tab1[i][1]);
	printf("\n");
	
}
 
2
  1. No ten kod z 92 to jest idiotyczny bo nie podałeś zmiennej którą ten printf ma wypisać, więc łyka coś ze stosu...
  2. Wstaw łaskawie w kodzie na początku main srand(time(0)); i się zrobią losowe liczby...
  3. Masz błąd off-by-one tutaj:
    for (int i = 0; i < 9; i++)    
    {
 
        if (tab1[i][1] > tab1[i+1][1])

i w operacjach poniżej. Skoro limitem dla i jest 0..8 to jakim prawem robisz tam i+1? Przecież i+1 to będzie 9! A takiego elementu w tablicy nie ma!

4
printf("%i  ");

Zła ilość argumentów dla funkcji printf, to jest UB.

0

No tak, błędy które przejdą przez kompilator...

  1. Fakt, zapomniałem dać zmienną.
  2. Skoro nie wywołałem losowości, to dlaczego na DevCpp poszło dobrze?
  3. Fakt, nie zauważyłem przekroczenia zakresu. Tylko, że mimo to program i tak działał. Edit. Ok, widzę błąd w
0
  1. Przypadek, kwestia implementacji, nie istotne. To jest błąd i tyle.
  2. Guzik a nie działał. Wychodziłeś poza tablicę więc zamazywałeś jakieś dane gdzieś obok tej tablicy. Że działało? Przypadek. Równie dobrze program mógł by sie wysypać.
0

Już mam. liczba z pierwszego wiersza jest z kosmosu a z drugiego 0, przy każdym generowaniu.

0
aron155 napisał(a):

No tak, błędy które przejdą przez kompilator...

W najnowszym visual studio, który dopiero wychodzi, błędy w argumentach funkcji printf są wyświetlane jako warningi.

2

tak w ogóle, to do wyświetlania inta %i jest niekoszerne i powinno się używać %d.

1 użytkowników online, w tym zalogowanych: 0, gości: 1