Wskażniki w C

0

Witam, co musiałbym zmienić, żeby zamiast tab,tab1,tab2 użyć jednego wskaźnika np. tab?

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

const int TABSIZE = 10;

void WyswietlTabliceInt(int* tab)
{
	printf("Tablica typu Integer:\n");
	for (int i = 0;i < TABSIZE;i++) {
		printf("%d\n", tab[i]);
	}
	printf("\n");
}
void WyswietlTabliceDouble(double* tab1)
{
	printf("Tablica typu Double:\n");
	int i;
	for (i = 0; i < TABSIZE; i++) {
		printf("%2.3f\n", tab1[i]);
	}
	printf("\n");
}
void WyswietlTabliceFloat(float* tab2)
{
	printf("Tablica typu Fload:\n");
	int i;
	for (i = 0; i < TABSIZE; i++) {
		printf("%0.5f\n", tab2[i]);
	}
	printf("\n");
}
int* ZrobTabliceInt()
{
    int* tab = (int*)malloc(TABSIZE*sizeof(int));
    for (int i = 0 ;i < TABSIZE;i++)
    {
        tab[i] = (int)&tab[i] % 65536;
    }
    return tab;
}

double* ZrobTabliceDouble()
{                                                         //!różnica między malloc i calloc
    double* tab1 = (double*)malloc(TABSIZE*sizeof(double));//!double* tab = (double*)calloc(TABSIZE,sizeof(double));
    for (int i = 0 ;i < TABSIZE;i++)
    {
        tab1[i] = ((double)((int)&tab1[i] % 65536) * 0.001); //!modulo działa tylko z integer
    }
    return tab1;
}

float* ZrobTabliceFloat()
{
    float* tab2 = (float*)malloc(TABSIZE*sizeof(float));
    for (int i = 0 ;i < TABSIZE;i++)
    {
        tab2[i] = ((float)((int)(&tab2[i]) % 65536) * 0.00001);
    }
    return tab2;
}

int main()
{
    int* tab = ZrobTabliceInt();
    WyswietlTabliceInt(tab);
    double* tab1 = ZrobTabliceDouble();
    WyswietlTabliceDouble(tab1);
    float* tab2 = ZrobTabliceFloat();
    WyswietlTabliceFloat(tab2);
    return 0;
}
 
0

Owe wskaźniki wskazują na inny typ, więc w tym przypadku by trzeba było to przepisać np. na tablicę wskaźników na void i w niej trzymać adresy do poszczególnych tablic różnych typów i stosować jawną konwersję przy wywoływaniu funkcji. Rodzina funkcji malloc właśnie zwraca wskaźnik na void i należy jawnie rzutować na wskaźnik danego typu.

Inną sprawą jest to, że mieszasz kod typowy dla C z C++. Inkludujesz iostream, lecz używasz do wypisywania printf, do alokacji pamięci malloc, a są przecież w C++ dostępne w standardowej bibliotece takie obiekty jak cout, cin czy operator alokacji new oraz zwalniania pamięci delete.

1
#include <iostream>
#define TABSIZE 10
using namespace std;


int *TabInt(){
    return new int[TABSIZE];
}
float *TabFloat(){
    return new float[TABSIZE];
}

int main()
{
    auto tab1 = TabInt();
    auto tab2 = TabFloat();
    void *tab = (void*)TabFloat();
}
 

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