webForumDet fria alternativet

Samma kod olika outputs

3 svar · 124 visningar · startad av SDCd

SDCdMedlem sedan jan. 2001795 inlägg
#1

Nu är förvirringen total :)
Jag har en kod som ser ut så här:

#include <iostream.h>

void main()
{
	const int bitar=8;
	int heltal=0;
	char binar[bitar] = {'\0'};
	
	cout << "Ange ett heltal: ";
	cin >> heltal;

	for(int i=bitar; i>0; i--)
	{
		cout << "heltal= " << heltal << endl;
		if (heltal%2 == 0)
		{
			binar[i] = '0';
		}
		else
		{
			binar[i] = '1';
		}
		cout << "Heltal efter IF= " << heltal << endl;
		heltal=heltal/2;
		
	}
	for(int a=1; a<=bitar; a++)
	{
		cout << binar[a];
	}
				
	
	cin.get();
	cin.get();
}

Denna kod fungerar som jag vill att den skall göra om jag kompilera den med VC++. Om jag komplierar den med g++ eller Borland och kör programmet så sätts variabeln heltal till 48 efter första gången loppen körs. Oavsett vilket värde jag skriver in. :q Varför?

Om jag ändrar koden till följande:

#include <iostream.h>

void main()
{
	const int bitar=8;
	int heltal=0,temp;
	char binar[bitar] = {'\0'};
	
	cout << "Ange ett heltal: ";
	cin >> heltal;

	for(int i=bitar; i>0; i--)
	{
		temp = heltal;
		cout << "heltal= " << heltal << endl;
		if (temp%2 == 0)
		{
			binar[i] = '0';
		}
		else
		{
			binar[i] = '1';
		}
		cout << "Heltal efter IF= " << heltal << endl;
		heltal=heltal/2;
		
	}
	for(int a=1; a<=bitar; a++)
	{
		cout << binar[a];
	}
				
	
	cin.get();
	cin.get();
}

Alltså flyttar över variabeln heltal till temp och sedan använder temp i IF--satsen fungerar koden när jag kompilerar den med g++, men med Borlands kompilator sätts variabeln fortfarande till 48. :q Varför?

Hjälp en förrvirrad själ! :)

Marcus EMedlem sedan maj 20021 466 inlägg
#2

Har inte kollat så mycket, men såg direkt att
for(int i=bitar; i>0; i--)
är fel.

for(int i=bitar - 1; i>=0; i--)
ska det vara. D.v.s. en loop från bitar-1 till 0 och inte från bitar till 1.

developerMedlem sedan aug. 2001458 inlägg
#3

Marcus E skrev:

Har inte kollat så mycket, men såg direkt att
for(int i=bitar; i>0; i--)
är fel.

for(int i=bitar - 1; i>=0; i--)
ska det vara. D.v.s. en loop från bitar-1 till 0 och inte från bitar till 1.

Jag noterade samma sak. Bara för skojs skull klistrade jag dessutom in koden i Visual Studio och provkörde. Hur miljö-oberoende man in vill vara är det trots allt ganska trevligt när med run-time checkarna i VC++. :) Jag tycker personligen det sköna med Microsoft-miljö är att det finns ganska mycket sånt här att tillgå utan 3:e parts verktyg. Det finns såklart motsvarande för alla, eller åtminstone de flesta, miljöer. Vilken miljö man än använder har man ganska mycket att vinna på att lära sig hur olika debug-hjälpmedel fungerar.

---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Error!

Program: c:\temp\foo\Debug\cpp_console.exe
Module: c:\temp\foo\Debug\cpp_console.exe
File: c:\temp\foo\cpp_console.cpp
Line: 68

Run-Time Check Failure #2 - Stack around the variable 'binar' was corrupted.

(Press Retry to debug the application)

SDCdMedlem sedan jan. 2001795 inlägg
#4

...Och huvudvärken släppte. Tackar och bugar :)

-->Developer, jag håller med dig om att det är väldigt bekvämt. Mina farhågor är dock att jag i min okunskap sitter och lär mig saker som sedan visar sig vara Microsoftspecifika. Givetvis kan liknande saker hända oavsett vilken kompilator jag väljer.

129 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)