Pointer na pole struktur – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pointer na pole struktur – C / C++ – Fórum – Programujte.comPointer na pole struktur – C / C++ – Fórum – Programujte.com

 

Marcel
~ Anonymní uživatel
14 příspěvků
15. 12. 2016   #1
-
0
-

Caute, neviete mi poradit ako mam passnut  pointer na pole struktur do funkcie? skusal som nieco taketo ale nefungovalo:

typedef struct point
{
	double x;
	double y;
}POINT;

void test(POINT *p,int i)
{
p[i].x=nieco;
}

int main
{
int i=0;
scanf("%d",&n);
POINT p=(POINT*)malloc(n*sizeof(POINT));
test(&p,i);
return 0;
}

v tej funkcii nepotrebujem menithodnotu tych struktur staci mi passnut value...neviete ako na to?

Dikes :)

Nahlásit jako SPAM
IP: 147.175.152.–
15. 12. 2016   #2
-
0
-

pomocí ukazatele se k položkám struktury přistupuje s použitím -> takto:

ukazatel->položka

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Marcel
~ Anonymní uživatel
14 příspěvků
15. 12. 2016   #3
-
0
-

#2 hlucheucho
To viem ale problem je ze neviem ako mam spravne poslat funkcii pointer na pole struktur pretoze  ked sa dostanem do tej funkcie tak zrazu su hodnoty tych struktur uplne ine (random velke cisla) ..takze potrebujem vediet ako to spravne passnut tej funkcii..Dakujem :)

Nahlásit jako SPAM
IP: 91.127.161.–
Marcel
~ Anonymní uživatel
14 příspěvků
15. 12. 2016   #4
-
0
-

#4 Marcel
Uz som na to prisiel :D posielal som POINT *p namiesto POINT **p...som debil :D

Nahlásit jako SPAM
IP: 91.127.161.–
16. 12. 2016   #5
-
0
-

Není nutné předat ukazatel na ukazatel. Stačí předat přímo ukazatel na pole. Tak to např. dělají funkce pro práci s řetězci.  

char text[64];  //text je ukazatel na pole typu char a je inicializovany, ukazuje na prvni prvek pole
char *p;        //p je ukazatel na (pole) char, neni inicializovany
char znak;
void funkce (char* s);  //funkce jako parametr prijima ukazatel na char - muze to byt znak nebo pole, napr. retezec

p = text;       //p jsem inicializoval, nyni ukazuje na prvni char v poli text, v tuto chvili je ukazatelem na pole text
znak = p[5];    //i s ukazatelem lze pracovat jako s polem, musi ukazovat na pole
funkce(text);   //ukazatel na pole text je predan jako parametr funkci
funkce(p);      //ukazatel p je predan funkci


a pak uvnitř funkce s tímto polem pracovat.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Staon0
Návštěvník
19. 12. 2016   #6
-
0
-

#1 Marcel
Pokud v C chcete do funkce předat pole, předává se jako ukazatel na první položku. A překladač vám pole, které dáte do argumentu volané funkce, na takový ukazatel automaticky převede. Tudíž v případě argumentu funkce není rozdíl mezi polem a ukazatelem (jde pouze o argument funkce, neznamená to, že není rozdíl mezi polem a ukazatelem).

Váš kód mi přijde téměř správný, pouze vám nesedí typ na řádce s mallocem a není důvod použít referenci při volání.

typedef struct point {
  double x;
  double y;
} POINT;

void test(POINT* p, int i) {
  p[i].x=nieco;
}

int main(int argc_, char* argv_[]) {
  int i = 0;
  scanf("%d",&n);
  POINT* p = (POINT*)malloc(n * sizeof(POINT));
  test(p, i);
  return 0;
}

Váš závěr, že je potřeba předávat ukazatel na ukazatel je mylný - z výše uvedené logiky byste musel mít pole ukazatelů na POINT, nikoliv pole POINTů.

Nahlásit jako SPAM
IP: 94.142.234.–
Jerry
~ Anonymní uživatel
504 příspěvků
19. 12. 2016   #7
-
0
-

#1 Marcel
nemělo by to bejt třeba takhle ?

// ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


typedef struct t_point
{
	double x;
	double y;

} Point;


void test(t_point* t_p_point[], int t_count) {

	for (int i = 0; i < t_count; i++) {

		printf("%d  %g  %g  \n", i, t_p_point[i]->x, t_p_point[i]->y);

	}// for 

}// void test(t_point* t_p_point[], int t_count) 

int main()
{

	const int max_records = 100;

	t_point* array_point[ max_records ] = {NULL};

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

	//
	for (int i = 0; i < max_records; i++) {

		array_point[i] = new t_point();
		array_point[i]->x = i;
		array_point[i]->y = i;

	}// for 
	
	//
	test(array_point, max_records);

	//
	for (int i = 0; i < max_records; i++) {

		delete( array_point[i] );

	}// for 

	scanf("...");

    return 0;

}// int main()
Nahlásit jako SPAM
IP: 194.228.128.–
gna
~ Anonymní uživatel
1849 příspěvků
19. 12. 2016   #8
-
0
-

#7 Jerry
Nemělo :-)

Nahlásit jako SPAM
IP: 213.211.51.–
Jerry
~ Anonymní uživatel
504 příspěvků
19. 12. 2016   #9
-
0
-

#1 Marcel
a co tohle ? je tohle lepší ?

// ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


typedef struct t_point
{
	double x;
	double y;

} Point;


void test(t_point(*t_p_array_point), int t_count) {

	for (int i = 0; i < t_count; i++) {

		printf("%d  %g  %g  \n", i, (*(t_p_array_point+i)).x, (*(t_p_array_point+i)).y);

	}// for 

}// void test(t_point* t_p_point[], int t_count) 

int main()
{

	const int max_records = 100;

	t_point array_point[ max_records ] = {NULL};
	t_point(*p_array_point) = NULL;

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

	//
	for (int i = 0; i < max_records; i++) {

		array_point[i].x = i;
		array_point[i].y = i;

	}// for 
	
	//
	p_array_point = &array_point[0];
	test(p_array_point, max_records);

	//
	for (int i = 0; i < max_records; i++) {

		//delete( array_point[i] );

	}// for 

	scanf("...");

    return 0;

}// int main()
Nahlásit jako SPAM
IP: 194.228.128.–
KIIV
~ Moderátor
+43
God of flame
19. 12. 2016   #10
-
0
-

#9 Jerry
Pokud to chces poradne zneprehlednit pro kohokoliv, kdo na to bude koukat, tak je to presne to co chces.

To same, cos vyvedl (jen vyrazne citelnejsi a pochopitelnejsi):

#include <stdio.h>

typedef struct t_point
{
    double x;
    double y;
} Point;

void test(Point * array_point, int t_count) {
    for (int i = 0; i < t_count; ++i) {
        printf("%d  %g  %g  \n", i, array_point[i].x, array_point[i].y);
    }
}

int main() {
    const int max_records = 100;

    Point array_point[max_records];
    
    for (int i = 0; i < max_records; ++i) {
        array_point[i].x = i;
        array_point[i].y = i;
    }

    test( array_point, max_records);
}

S dynamicky alokovanou pameti treba takto (bez kontroly, ze alokace probehla a ze bylo zadano nejake spravne cislo):

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

typedef struct t_point
{
    double x;
    double y;
} Point;

void test(Point * array_point, int t_count) {
    for (int i = 0; i < t_count; ++i) {
        printf("%d  %g  %g  \n", i, array_point[i].x, array_point[i].y);
    }
}

int main() {
    int records = 1;
    printf("Zadej pocet zaznamu: ");
    scanf("%d",&records);

    Point * array_point = (Point *)malloc(records * sizeof(Point));
    
    for (int i = 0; i < records; ++i) {
        array_point[i].x = i+1;
        array_point[i].y = i*1.154;
    }

    test( array_point, records);

    free(array_point);
}

Jeden z duvodu, proc predat adresu na pointer je ten, ze chcete zmenit pointer uvnitr funkce a aby se zmena projevila na vnejsek (obvykla chyba zacatecniku):

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

typedef struct t_point
{
    double x;
    double y;
} Point;

int some_init(Point ** p) {
    int records = 1;
    printf("Zadej pocet zaznamu: ");
    scanf("%d", &records);
    if (records > 0) {
        *p = (Point *)malloc(records * sizeof(Point));
        return records;
    }
    return 0;
}

void test(Point * array_point, int t_count) {
    for (int i = 0; i < t_count; ++i) {
        printf("%d  %g  %g  \n", i, array_point[i].x, array_point[i].y);
    }
}

int main() {
    Point * array_point = NULL;

    int records = some_init(&array_point);

    if (NULL != array_point) {
    
        for (int i = 0; i < records; ++i) {
            array_point[i].x = i+1;
            array_point[i].y = i*1.154;
        }

        test( array_point, records);

        free(array_point);
    }
}

A v C++ by to byl vylozene hnusnej kod, da se to udelat mnohem jednoduseji a tak.

Nahlásit jako SPAM
IP: 94.113.99.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jerry
~ Anonymní uživatel
504 příspěvků
19. 12. 2016   #11
-
0
-

#1 Marcel
jo tak teď už bych v tom měl totální zmatek

eště že nejsem programátor :)

Nahlásit jako SPAM
IP: 194.228.128.–
Staon0
Návštěvník
19. 12. 2016   #12
-
0
-

Wow, myslel jsem, že otázka zněla "jak předat pole do funkce?" Netušil jsem, že to je soutěž o vytvoření co nejvíce variant toho samého :-D

Nahlásit jako SPAM
IP: 94.112.135.–
KIIV
~ Moderátor
+43
God of flame
19. 12. 2016   #13
-
0
-

#12 Staon
je to jen ukazka, co vse se s tim da delat a ze neni potreba pointer na pointer, kdyz ho nepotrebuje menit. Pokazde, kdyz nekdo znovu objevuje kolo implementaci treba fronty nebo jine abstraktni datove struktury to pak hasne prave na tehle drobnosti - parametry jsou predavane kopii, pokud se zmeni adresa v predanem pointeru, tak adresa venku zustava stale stejna. Pokud se ale zmeni data na te adrese, tak se to projevi i venku.

Nahlásit jako SPAM
IP: 94.113.99.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 50 hostů

Podobná vlákna

Pole struktur — založil Kuba-$

Velikost pole struktur — založil Redby

C Pole Struktur String — založil NotBeginner

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý