webForumDet fria alternativet

Fel med pekare...

C/C++

3 svar · 236 visningar · startad av Broms

Medlem sedan sep. 2002188 inlägg
Frågan#1

I koden nedan blir det ett fel. Felet är i funktionen ordna, som i sin tur skall använda sig av funktionen swap. Erroren som kommer är:

In function `void ordna(int*, int*, int*)':
cannot convert `int**' to `int*' for argument `1' to `void swap(int*, int*)'
cannot convert `int**' to `int*' for argument `2' to `void swap(int*, int*)'
cannot convert `int**' to `int*' for argument `1' to `void swap(int*, int*)'

\<------------ VARFÖR STÅR DET INT\*\*?????????

de är på raderna swap(&x, &y); osv, inuti ordna-funktionen. Kan någon hjälpa lite? Det har ju att göra med att pekarna inte fungerar som det ska..

/*
  Name: Swap2_3
  Copyright: none
  Author: Ebs.
  Date: 24-04-05 02:07
  Description: Programmet har två funktioner. Den första byter plats på 
               värdena i 2 variabler. Den andra byter plats på värdena i
               3 variabler.
*/

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

/*********************

    Namn: swap

    Beskrivning: Byter plats på värdena i de 2 variablerna x,y.

    Inparameter: int x, y.

    Utparameter: int x, y.

**********************/  
void swap(int *x, int *y);

/*********************

    Namn: ordna

    Beskrivning: Byter plats på värdena i de 3 variablerna x,y,z.

    Inparameter: int x, y, z.

    Utparameter: int x, y, z.

**********************/  
void ordna(int *x, int *y, int *z);

int main()
{

int x=6, y=4, z=5;

printf("Innan swap:\n");
printf("x=%d, y=%d\n",x,y);
swap(&x,&y);
printf("Efter swap:\n");
printf("x=%d, y=%d\n\n\nDel2..\n\n",x,y);

//reset values
x=6; 
y=4; 
z=5;

printf("Innan ordna:\n");
printf("x=%d, y=%d, z=%d\n\n",x,y,z);

printf("Efter ordna:\n");
printf("x=%d, y=%d, z=%d\n\n",x,y,z);
ordna(&x, &y, &z);
printf("\n\nProgrammet avslutas..\n\n");

system("PAUSE");
return 0;
}
void swap(int *x, int *y){
     int slask;
     slask = *x;
     *x = *y;
     *y = slask;
}  //end swap

void ordna(int *x, int *y, int *z){
if(*y>*x)
     swap(&y,&x);
if(*z>*y)
     swap(z,&y);
if(*y>*x)
     swap(&y,&x); //kör samma som ovan en extra gång då det ursprungliga z måste jämföras med både x,y.
}  //end ordna
Medlem sedan juni 200010 432 inlägg
#2

Du gör fel med:

void ordna(int *x, int *y, int *z){
if(*y>*x)
     swap(&y,&x);
if(*z>*y)
     swap(z,&y);
if(*y>*x)
     swap(&y,&x); //kör samma som ovan en extra gång då det ursprungliga z måste jämföras med både x,y.
}  //end ordna

x,y,z är deklarerade i funktionen ordna, som pekare. Det du skickar med som parametrar till swap i dina anrop är adressen till pekaren och inte pekaren. Så ta bort '&' före dina x,y,z's i funktionen 'ordna' så bör det lösa sig. För att få programmet att funka som du vill mot utskrifterna bör du även flytta upp anropet av 'ordna' till innan den sista utskriften :)

Medlem sedan sep. 2002188 inlägg
#3

tackar PeW, nu funkar det som det skall!! Var inte bara felsökningen utan förklaringen som var guld värd. Förstod först inte varför det vart en "dubbel" pekare, dvs adressen till pekaren..

Mvh Broms

Medlem sedan juni 200010 432 inlägg
#4

Vassego :)

253 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)