Trädvy Permalänk
Medlem
Plats
Falköping
Registrerad
Mar 2005

C++ pekare

Koden jag skriver här är korrekt men sen vill jag göra följande:
"Loopen ska använda pekare för stegning genom arrayen. Initiera loopen genom att låta en pekare peka på arrayens första element och låt sedan denna pekare förfltta sig genom arrayens element för elelemnt tills arrayen är slut."
-Vet inte hur jag börjar med detta.

#include <iostream>
#include <cstdlib>
using namespace std;
//#include "\..iodos.h" Denna funkar inte av nån anledning
#include <time.h>

int main()
{
int size=0;
cout << "Give me the size of the array: ";
cin >> size;
//int Myarray[] = new int[size]; kan man skriva så här istället med Myarray?
int *Myarray;
Myarray = new int[size];
int summa=0;
int counter=0;
srand((unsigned)time(NULL)); //kräver #include <time.h> och gör att det slumpas olika tal varje gång

for (int i = 0; i<size;i++)
{
Myarray[i]= rand()%10000 - 5000; // Slumpa ett flyttal i intervallet -5000 till 5000
summa = summa + Myarray[i]; //beräknar sammanlagda värdet

if(counter<5) //Stoppas för varje 200 nummer
{
cout << Myarray[i] <<endl;
counter++;
}
else
{
system ("PAUSE");
cout << endl<< Myarray[i] <<endl;
counter=0; //räknaren nollställs
}

}
cout << endl <<"The sum of all arrays are: " <<summa<<endl;

system ("PAUSE");

return 0;
}

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jan 2004
Citat:

Ursprungligen inskrivet av MacDaddy
Koden jag skriver här är korrekt men sen vill jag göra följande:
"Loopen ska använda pekare för stegning genom arrayen. Initiera loopen genom att låta en pekare peka på arrayens första element och låt sedan denna pekare förfltta sig genom arrayens element för elelemnt tills arrayen är slut."
-Vet inte hur jag börjar med detta.

#include <iostream>
#include <cstdlib>
using namespace std;
//#include "\..iodos.h" Denna funkar inte av nån anledning
#include <time.h>

int main()
{
int size=0;
cout << "Give me the size of the array: ";
cin >> size;
//int Myarray[] = new int[size]; kan man skriva så här istället med Myarray?
int *Myarray;
Myarray = new int[size];
int summa=0;
int counter=0;
srand((unsigned)time(NULL)); //kräver #include <time.h> och gör att det slumpas olika tal varje gång

for (int i = 0; i<size;i++)
{
Myarray[i]= rand()%10000 - 5000; // Slumpa ett flyttal i intervallet -5000 till 5000
summa = summa + Myarray[i]; //beräknar sammanlagda värdet

if(counter<5) //Stoppas för varje 200 nummer
{
cout << Myarray[i] <<endl;
counter++;
}
else
{
system ("PAUSE");
cout << endl<< Myarray[i] <<endl;
counter=0; //räknaren nollställs
}

}
cout << endl <<"The sum of all arrays are: " <<summa<<endl;

system ("PAUSE");

return 0;
}

för det första så den syntaxen som du föreslår i kommentaren fungerar inte utan du måste göra så som du gör nu, alt. använda malloc (c-stil). För det andra så stegar du ju redan igenom arrayen med din pekare nu! När du allokerar nytt minne på heapen med new så kommer din pekare automatiskt att peka på första elementet i arrayen. Sen så kan du antingen stega dig frammåt med vanlig arrayindexering så som du gör nu eller så kan du skriva Myarray++ för att flytta pekaren ett steg frammåt. Observera att Myarray[0] och Myarray evalueras till samma värde (adress). Någon får rätta mig om det sluntit ur nån groda här, jag kodar väldigt lite nu för tiden.

ASUS z-97 A, i7 4790k, Inno3D 980 Ti iChill X3 Ultra, 16 gb DDR3 PC12800/1600MHz

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jan 2007
Citat:

Ursprungligen inskrivet av MacDaddy
//#include "\..iodos.h" Denna funkar inte av nån anledning

Det beror på att det sannolikt ska vara "../iodos.h". Orkar inte riktigt kolla på ditt "riktiga" problem nu. Ett tips är dock att posta din kod med code-taggen, typ

din kod här

. Eller, om du har mycket kod som du har nu, posta det på pastebin.

Trädvy Permalänk
Medlem
Registrerad
Jun 2006

Hej! Ska försöka hjälpa dig.

1. Antar att du ska ha iodos.h till åäö? men då utskriften sker på engelska i ditt program kanske vi ska hoppa den?

2. sedan skriver vi ihop declarationen och definitionen av myarray till en rad och ändrar vi första bokstaven till en liten:

int* myArray = new int[size];

3. Vi struntar i integer counter och använder oss av modulus på i för att stanna var 200 gång.

if (i%200>0)

4. Igentligen skall man inte använda modulus på rand då detta inte matematiskt sett ger en korrekt slump men vi struntar i det nu då detta inte är intressant för uppgiften.

5. system("pause") är plattformsberoende och bör också undivkas. Istället kan du t.ex. använda getchar().

6. Nu till själva pekaren. att skriva hej[5] är samma sak som *(hej+5). Om du vill använda pekararitmetik kan du skriva *(myArray+i) vilket är samma sak som myArray[i]. (för att bevisa detta kan du testa i[myArray] som blir *(i+myArray) vilket är exakt samma sak då 1+2=2+1 )

7. Sedan adderar vi summan med

summa+= *(myArray+i);

som ger exakt samma värde fast kortare och med pekararitmetik.

svar:

#include <iostream> #include <time.h> using namespace std; int main(int argc, char *argv[]) { int size=0; cout << "Give me the size of the array: "; cin >> size; int *myArray = new int[size]; int summa=0; srand((unsigned)time(NULL)); //kräver #include <time.h> och gör att det slumpas olika tal varje gång for (int i=0; i<size; i++) { *(myArray+i)= rand()%10000 - 5000; // Slumpa ett flyttal i intervallet -5000 till 5000 summa += *(myArray+i); //beräknar sammanlagda värdet if (i%200>0) { cout << *(myArray+i) <<endl; } else //Stoppas för varje 200 nummer { getchar(); cout << endl<< *(myArray+i) <<endl; } } cout << endl <<"The sum of all arrays are: " << summa << endl; getchar(); return EXIT_SUCCESS; //samma sak som return 0 fast tydligare vad man vill }

citera!

Trädvy Permalänk
Medlem
Plats
Falköping
Registrerad
Mar 2005

GULD Dosshell.

En fråga: Att skriva Myarray[i] använder man pekaren Myarray[i] då eller gör man bara det med *(myArray+i)?

BTW, var en liten fortsättning på progget. Här ska jag gå stege igenom en array med en pekare men är osäker på om jag gjort det verkligen.

//Beräkna minsta värdet
int *counterpekare2 = &Myarray[0];

for (int i=1; i<size; i++)
{
if (*counterpekare2 > Myarray[i])
{
counterpekare2 = &Myarray[i];
}

}
cout << endl << "The smallest number in the array is: "<<*counterpekare2<<endl;

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Citat:

Ursprungligen inskrivet av MacDaddy

BTW, var en liten fortsättning på progget. Här ska jag gå stege igenom en array med en pekare men är osäker på om jag gjort det verkligen.

Nej, du använder inte en pekare för att stega igenom arrayen, utan ett index. För att stega igenom den med en pekare så får du sätta en pekare till början av arrayen, och sen öka på pekaren istället. Ex:

int *counterpekare2 = &Myarray[0]; // Pekare till det första elementet. counterpekare++; // Nu pekar counterpekare på det andra elementet. counterpekare += 5; // Nu pekar counterpekare på det sjunde elementet.

Om du vill förstå pekare och arrayer bättre så rekommenderar jag att du läser igenom denna sida.

Trädvy Permalänk
Medlem
Registrerad
Dec 2004

Um... jag tror nog inte riktigt att det är detta som efterfrågas egentligen. Jag skulle nog tippa på att det mera är tänkt att skötas såhära:

int* cur = &Myarray[0]; int* end = &Myarray[size]; while(cur != end) { // Do stuff. cur++; }

(eller skriva om det i for-form)

Vidare så är Myarray[i] ingen pekare utan bara ett specifikt element (i detta fall en "int"). Myarray är en pekare. &Myarray[i] är också en pekare. (Myarray + i) är en pekare. *(Myarray + i) är ett element (som (Myarray + i) pekare på).

Edit: Aningen för långsam med mitt svar.

"Nothing is impossible because impossible itself says I M Possible..."

Trädvy Permalänk
Medlem
Plats
Falköping
Registrerad
Mar 2005

JAg misstänkte det men förstår inte hur jag ska skriva det i en for-loop.

for(int *counterpekare2 = &Myarray[0]; counterpekare2????> Myarray[]; counterpekare2++)

PRoblemet här är väl att den inte vet när Myarray är slut då talet i myarray lagras i counterpekare2, inte dess talnummer.

Trädvy Permalänk
Medlem
Registrerad
Dec 2004

Se min kod. Variabeln "end" (d.v.s. &Myarray[size]) pekare på elementet efter det sista elementet. Så, loopen ska fortsätta så länge som pekaren inte har nått det elementet (d.v.s. "cur != end").

Rekommenderas starkt att man läser lite extra på lärobokens/tutorialens kapitel om pekare. Din syntax visar att du inte har helt koll på det.

ps. Nu vet jag inte riktigt hur långt du har kommit, men pekare fungerar på samma sätt som STL-iteratorer i C++.

"Nothing is impossible because impossible itself says I M Possible..."

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av MacDaddy
En fråga: Att skriva Myarray[i] använder man pekaren Myarray[i] då eller gör man bara det med *(myArray+i)?

En rolig detalj är att, då Myarray[i] bara är ett förenklat skrivsätt för *(Myarray + i), att det fungerar lika bra att skriva
i[Myarray]
(som alltså tolkas som *(i + Myarray) istället.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jan 2007
Citat:

Ursprungligen inskrivet av Elgot
En rolig detalj är att, då Myarray[i] bara är ett förenklat skrivsätt för *(Myarray + i), att det fungerar lika bra att skriva
i[Myarray]
(som alltså tolkas som *(i + Myarray) istället.

Ett av många trevliga små fulhack som gör att C är så komplext och svårbemästrat.