Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Listy jako argumenty funckji

Ostatnio zmodyfikowano 2017-03-24 18:40
Autor Wiadomość
CTRL85
Temat założony przez niniejszego użytkownika
[C] Listy jako argumenty funckji
» 2017-03-22 20:44:35
Witam!

Mam ewien problem, a mianowicie chcę napisać funkcję, która będzie Mi uzupełniała listę, jednak to co napisałem nie działa i poza funkcją w liście mam tylko jeden (pierwszy) element. Najdziwniejsze jest to, że Wypełnianie listy przeszkód działa dobrze, ale pozycje węża i jedzenia nie działają.

C/C++
#include <stdio.h>
#include <stdlib.h>

typedef struct Wonsz {
    int PosX;
    int PosY;
    int PosZ;
   
    struct Wonsz * nast;
} Wonrz;

typedef struct Przeszkoda {
    int PosX;
    int PosY;
    int PosZ;
   
    char Znak;
   
    struct Przeszkoda * nast;
} PrzeSzkoda;

typedef struct Zarcie {
    int PosX;
    int PosY;
    int PosZ;
   
    int Punkty;
   
    char Znak;
   
    struct Zarcie * nast;
} Jedzonko;

void DodajPrzeszkode( PrzeSzkoda * przeszk, int x, int y, int z, char znak ) {
    PrzeSzkoda * Temp = przeszk;
    while( Temp->nast != NULL )
         Temp = Temp->nast;
   
    Temp->nast = malloc( sizeof( PrzeSzkoda ) );
   
    Temp->nast->PosX = x;
    Temp->nast->PosY = y;
    Temp->nast->PosZ = z;
   
    Temp->nast->Znak = znak;
   
    Temp->nast->nast = NULL;
}

void DodajZarcie( Jedzonko ** zarlo, int x, int y, int z, char znak ) {
    Jedzonko * Temp;
    Temp = malloc( sizeof( Jedzonko ) );
   
    Temp->PosX = x;
    Temp->PosY = y;
    Temp->PosZ = z;
   
    Temp->Znak = znak;
   
    if( znak == '@' )
         Temp->Punkty = 1;
    else if( znak == '%' )
         Temp->Punkty = 2;
    else if( znak == '$' )
         Temp->Punkty = 3;
    else if( znak == '*' )
         Temp->Punkty = 4;
   
    if( * zarlo != NULL )
         Temp->nast = * zarlo;
   
    * zarlo = Temp;
}

void DodajFragmentWeza( Wonrz ** wonsz, int x, int y, int z ) {
    Wonrz * Temp;
    Temp = malloc( sizeof( Wonrz ) );
   
    Temp->PosX = x;
    Temp->PosY = y;
    Temp->PosZ = z;
   
    if( * wonsz != NULL )
         Temp->nast = * wonsz;
   
    * wonsz = Temp;
}

void WypiszZarcie( Jedzonko * zarcie ) {
    Jedzonko * Temp = zarcie;
   
    while( Temp ) {
        printf( "%c:%i;%i;%i", Temp->Znak, Temp->PosX, Temp->PosY, Temp->PosZ );
        Temp = Temp->nast;
    }
}

void WypiszPrzeszkody( PrzeSzkoda * przeszk ) {
    PrzeSzkoda * Temp = przeszk;
   
    while( Temp ) {
        printf( "\n%c:%i;%i;%i", Temp->Znak, Temp->PosX, Temp->PosY, Temp->PosZ );
        Temp = Temp->nast;
    }
}

void WypiszWonrza( Wonrz * wonsz ) {
    Wonrz * Temp = wonsz;
   
    while( Temp->nast ) {
        Temp = Temp->nast;
        WypiszWonrza( Temp );
    }
   
    printf( ":%i;%i;%i|", Temp->PosX, Temp->PosY, Temp->PosZ );
}

void WczytajDane( Wonrz * wonsz, PrzeSzkoda * Przeszkody, Jedzonko * Zarelko, char * PrzeszkChar, int * IleRozgrywek, int * Promien, int * Wysokosc, int * IleElementow, int * IlePrzeszkod, int * IleZarcia ) {
   
    int x, y, z;
   
    printf( "Wprowadz znak przeszkody: " );
    * PrzeszkChar = getchar();
   
    printf( "\nWprowadz ilosc rozgrywek: " );
    scanf_s( "%i", IleRozgrywek );
   
    printf( "\nWprowadz promien walca: " );
    scanf_s( "%i", Promien );
   
    printf( "\nWprowadz wysokosc walca: " );
    scanf_s( "%i", Wysokosc );
   
    printf( "\nPosX: " );
    scanf_s( "%i", & wonsz->PosX );
   
    printf( "\nPosY: " );
    scanf_s( "%i", & wonsz->PosY );
   
    printf( "\nPosZ: " );
    scanf_s( "%i", & wonsz->PosZ );
   
    Wonrz * Temp;
    Temp = malloc( sizeof( Wonrz ) );
   
    printf( "\nPosX: " );
    scanf_s( "%i", & Temp->PosX );
   
    printf( "\nPosY: " );
    scanf_s( "%i", & Temp->PosY );
   
    printf( "\nPosZ: " );
    scanf_s( "%i", & Temp->PosZ );
   
    if( wonsz != NULL )
         Temp->nast = wonsz;
   
    wonsz = Temp;
   
    printf( "\nIle Elementow specjalnych: " );
    scanf_s( "%i", IleElementow );
   
    for( int i = 0; i < * IleElementow; i++ ) {
        char t;
        char temp;
       
        printf( "\nZnak: " );
       
        scanf_s( " %c", & t );
       
        printf( "\nPozycja X: " );
        scanf_s( "%i", & x );
       
        scanf_s( " %c", & temp );
       
        printf( "\nPozycja Y: " );
        scanf_s( "%i", & y );
       
        scanf_s( " %c", & temp );
       
        printf( "\nPozycja Z: " );
        scanf_s( "%i", & z );
       
        if( t == * PrzeszkChar ) {
            if( * IlePrzeszkod == 0 ) {
                Przeszkody->PosX = x;
                Przeszkody->PosY = y;
                Przeszkody->PosZ = z;
               
                Przeszkody->Znak = * PrzeszkChar;
               
                Przeszkody->nast = NULL;
            }
            else
                 DodajPrzeszkode( Przeszkody, x, y, z, * PrzeszkChar );
           
            IlePrzeszkod += 1;
        }
        if( t == '@' || t == '%' || t == '$' || t == '*' ) {
            if( * IleZarcia == 0 ) {
                Zarelko->PosX = x;
                Zarelko->PosY = y;
                Zarelko->PosZ = z;
               
                Zarelko->Znak = t;
               
                if( t == '@' )
                     Zarelko->Punkty = 1;
                else if( t == '%' )
                     Zarelko->Punkty = 2;
                else if( t == '$' )
                     Zarelko->Punkty = 3;
                else if( t == '*' )
                     Zarelko->Punkty = 4;
               
            }
            else
                 DodajZarcie( & Zarelko, x, y, z, t );
           
            * IleZarcia += 1;
        }
    }
}

int main() {
    char PrzeszkChar = ' ';
   
    int Wysokosc = 0;
    int Promien = 0;
   
    int IleRozgrywek = 0;
    int IleElementow = 0;
    int IlePrzeszkod = 0;
    int IleZarcia = 0;
   
    Wonrz * Wenszyk = NULL;
    Wenszyk = malloc( sizeof( Wonrz ) );
    Wenszyk->nast = NULL;
   
    PrzeSzkoda * Przeszkody = NULL;
    Przeszkody = malloc( sizeof( PrzeSzkoda ) );
    Przeszkody->nast = NULL;
   
    Jedzonko * Zarelko = NULL;
    Zarelko = malloc( sizeof( Jedzonko ) );
    Zarelko->nast = NULL;
   
    WczytajDane( Wenszyk, Przeszkody, Zarelko, & PrzeszkChar, & IleRozgrywek, & Promien, & Wysokosc, & IleElementow, & IlePrzeszkod, & IleZarcia );
   
    printf( "\n" );
    WypiszWonrza( Wenszyk );
    printf( "\n" );
    WypiszPrzeszkody( Przeszkody );
    printf( "\n" );
    WypiszZarcie( Zarelko );
    printf( "\n\n" );
}
P-159241
darko202
» 2017-03-23 08:47:11
Ja bym postawił na to, że źle konstrujesz listę

w "void DodajPrzeszkode( ...)"

masz magiczne
   
    while( Temp->nast != NULL )
         Temp = Temp->nast;

a w "void DodajZarcie(...)" i "void DodajFragmentWeza(...)"  nie


co robi to magiczne while ?
opis z
http://www.p-programowanie.pl​/cpp/lista-jednokierunkowa-c/
C/C++
while( temp->nastepna )
{
    // znajdujemy wskaźnik na ostatni element
    temp = temp->nastepna;
}
 


2.
a poza tym jakoś razi ten "wonsz"
https://pl.wikipedia.org/wiki​/W%C4%99%C5%BCe
P-159253
CTRL85
Temat założony przez niniejszego użytkownika
» 2017-03-23 14:48:43
To może inaczej:

C/C++
#include <stdio.h>
#include <stdlib.h>

typedef struct Test {
    int Pos;
   
    struct Test * nast;
} test;

void AddElemet( test ** element, int val ) {
    test * Temp;
    Temp = malloc( sizeof( test ) );
   
    Temp->Pos = val;
   
    if( * element != NULL )
         Temp->nast = * element;
   
    * element = Temp;
}

void FunkcjaDwa( test * elem, int val ) {
    AddElemet( & elem, 1 );
}

void FunkcjaJeden( test * elem ) {
    FunkcjaDwa( elem, 1 );
    FunkcjaDwa( elem, 2 );
}

int main() {
    test * element = NULL;
    element = malloc( sizeof( test ) );
    element->nast = NULL;
   
    element->Pos = 0;
   
    FunkcjaJeden( element );
}

Jak zrobić, żeby po wykonaniu takich funkcji mieć listę trzech elementów? Aktualnie w FunkcjiDwa() Dodają się te elementy, ale już w FunkcjiJeden() zostaje tylko ten z maina.

A co do Twojego posta - chodzi o to, że w DodajPrzeszkode() dodaje na koniec listy, a w reszcie na początek.
P-159266
darko202
» 2017-03-24 10:48:36
problemem jest przekazywanie zmiennej przez referencję
http://cpp0x.pl/kursy/Kurs-C++​/Poziom-3​/Przekazywanie-argumentow-funk​cji-przez-referencje​/356

tzn. u Ciebie braku tej referencji
co skutkuje,  że wewnątrz funkcji void FunkcjaJeden( test * elem ) argument jest nową zmienną
P-159323
CTRL85
Temat założony przez niniejszego użytkownika
» 2017-03-24 17:54:32
Nie mam pojęcia jak to rozwiązać, próbowałem już chyba wszystkie możliwosci z & oraz * żadna nie zadziałała.
P-159333
mateczek
» 2017-03-24 18:40:31
przerób sobie na "c" bo mi się te "maloc" nie chciało kompilować nawet więc zastąpiłem new z c++
C/C++
#include <stdio.h>
#include <stdlib.h>
#include<iostream>

typedef struct Test {
    int Pos;
   
    struct Test * nast;
} test;

void AddElemet( test ** element, int val ) {
    test * Temp = new test;
    Temp->Pos = val;
    if( * element != NULL )
         Temp->nast = * element;
   
    * element = Temp;
}

void FunkcjaDwa( test ** elem, int val ) {
    AddElemet( elem, val );
}

void FunkcjaJeden( test ** elem ) {
    FunkcjaDwa( elem, 1 );
    FunkcjaDwa( elem, 2 );
}

int main() {
    test * element = NULL;
    element = new test;
    element->nast = NULL;
   
    element->Pos = 0;
    FunkcjaJeden( & element );
    for( test * el = element; el; el = el->nast ) {
        std::cout << el->Pos << " ";
    }
   
}
P-159335
« 1 »
  Strona 1 z 1