Uzywanie new w funkcjach - inicjalizacja tablicy w funkcji

0

Witam serdecznie

Do funkcji przekazuje wskaźnik ** na tablice char (wymiar nie określony, nie zdefiniowany). W funkcji odczytuje dane które pozwalają zdefiniować wielkość tej tablicy i używałem "new". Czy można w funkcji dokonać inicjalizacji wielkości tablicy? Moje próby wykazują że po wyjściu z funkcji wszystkie dane wpisane do tablicy uległy usunięciu, czyli nie pozwoliło mi wykonać inicjalizacji. Szukam jakiś tipsów jak to zrobić i nic. Czy ktoś może mi posunąć jakiś pomysł.

Dzieki Marcin

0

Tak, mozna w funkcji tworzyc tablice.

#include <iostream>
#include <utility>
using namespace std;

pair<int*, size_t> createArray() {
	return make_pair(new int[5], 5);
}

int main() {
	pair<int*, size_t> array = createArray();
	delete[] array.first;
	return 0;
}
0

Musisz powiedzieć więcej szczegółów ponieważ w zależności od tego odpowiedź będzie się wahać:

  1. nie da się
  2. można ale w sposób skomplikowany (patrz post wyżej)
  3. jest to prymitywnie proste, patrz strdup()
0

Domyślam się, że chodzi ci o coś takiego:

#include <cstdio>
#include <cstdlib>

int * InitTab(int iSizeOfTab)
{
	if(iSizeOfTab > 0)
	{
		int * pTab = new int[iSizeOfTab];
		for(int i = 0; i < iSizeOfTab; i++)
			pTab[i] = (rand()%50)+1;
		
		for(int i = 0; i < iSizeOfTab; i++)
			printf("%i ", pTab[i]);
		
		return pTab;
	}
	return 0;
}
int main(int, char**)
{
	int iSizeOfTab = 0;
	scanf("%i", &iSizeOfTab);
	int * pTab = InitTab(iSizeOfTab);
	puts("\n");
	for(int i = 0; i < iSizeOfTab; i++)
			printf("%i ", pTab[i]);
	
	delete[] pTab;
	
	int stop;
	scanf("%d", &stop);
	return 0;
}

http://ideone.com/ETaPIB

Ale sprecyzuj bardziej o co ci konkretniej chodzi, bo szklane kule się skończyły.

0

Witajcie

Z grubsza opisze problem. Funkcja działa jak znajduje się w tym samym pliku, lecz jak ją przeniosłem do zewnętrznego pliku to już po zakończeniu wykonywania funkcji tablica która jest w głównej pętli programu jest dalej nie zainicjalizowana.

void odczyt_z_pliku(unsigned char **tablica)
{
int ilosc_wierszy,ilosc_kolumn;
//odczyt z pliku wartosci dla ilosc_wierszy,ilosc_kolumn

tablica=new unsigned char [ilosc_wierszy];
for (int i=0, i<ilosc_wierszy)
	{
		tablica[i]=new unsigned char [ilosc_kolum];
	}	


// dalsze wypelnienie tablica wartosciami z pliku

}

int _tmain(int argc, _TCHAR* argv[])
{
unsigned char **wejscia = NULL;  
odczyt_z_pliku(wejscia);
} 

Dzięki

Pozdrawiam

1

void odczyt_z_pliku(unsigned char **tablica)

zmień na:
void odczyt_z_pliku(unsigned char **&tablica)

0

jeżeli to tablica stringów to dla każdego wskaźnika w tablicy wskaźników można użyć po prostu czegoś na wzór strdup.
dodatkowo jeżeli to ta tablica stringow to

void read_file(const char *filepath, char **arrptr, unsigned *rows);

.
chyba, że nie przyda Ci się ilość wierszy w main'ie.

0
mwl4 napisał(a):

void odczyt_z_pliku(unsigned char **tablica)

zmień na:
void odczyt_z_pliku(unsigned char **&tablica)

Dodanie & rozwiązało sprawę. Nie bardzo tylko rozumiem idei. Dostałem rybę, a mogę dostać wędkę?

Dzięki

0
mbialas napisał(a):

Dostałem rybę, a mogę dostać wędkę?

Masz śledzia: modyfikacja kopii nie zmienia oryginału.

1
unsigned char **odczyt_z_pliku()
  {
   unsigned char **tablica;
   size_t ilosc_wierszy,ilosc_kolumn;
  //odczyt z pliku wartosci dla ilosc_wierszy,ilosc_kolumn
 
   tablica=new unsigned char[ilosc_wierszy];
   for(size_t i=0;i<ilosc_wierszy;++i) tablica[i]=new unsigned char[ilosc_kolum];
// dalsze wypelnienie tablica wartosciami z pliku
   return tablica;
  }
 
int _tmain(int argc, _TCHAR* argv[])
  {
   unsigned char **wejscia=odczyt_z_pliku();
   return 0;
  }
0

Dziękuje wszystkim.

Zastosowałem odniesienie przez referencję.

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1