Widoczność tabicy

0

Witam, mam taki kod:

#include <stdio.h>
#include <stdlib.h>
void wczytaj(int n,int *A);
void bublesort(int n,int *A);
void wyswietl(int n,int *A);
void insertsort(int n,int *A);
void selectsort(int n,int *A);
int main()
{
    int x;
    int n;
    printf("1.Pobieranie danych.\n");
    printf("2.Sortowanie babelkowe.\n");
    printf("3.Insert sort.\n");
    printf("4.Select sort.\n");
    printf("5.Wyowietlanie tablicy.\n");
    printf("6.Koniec programu.\n");
    do{
    printf("Co chcesz zrobic?: ");
    scanf("%d",&x);
    switch(x){
        case 1:{
        printf("Podaj wielkosc tablicy: ");
        scanf("%d",&n);
        int A[n];
        wczytaj(n,A);}
            break;
        case 2:{
            bublesort(n,A);
        }
            break;
        case 3:


            break;
        case 4:


            break;
        case 5:


            break;

    }
    }while(x!=6);


    return 0;
}

void wczytaj(int n,int *A){
    int i;
    for(i=1;i<=n;i++){
        printf("Podaj element tablicy o indeksie nr %d: ",i);
        scanf("%d",&A[i]);
    }

}

void bublesort(int n,int *A){
int i=n;
int j,pom;
while(i>=2){
    j=2;
    while(j<=i){
        if(A[j]<A[j-1]){
             A[j-1]=pom;
             A[j-1]=A[j];
             A[j]=pom;
            j++;
        }
     i--;
    }
}
}

void wyswietl(int n,int *A){
int i;
for(i=1;i<=n;i++){
    printf("%d ",A[i]);

}

}

void insertsort(int n,int *A){
int i=2;
int j,pom,p;
    while(i<=n){
        j=i-1;
        p=A[i];
        A[0]=p;
        while(A[j]>p){
            A[j-1]=pom;
             A[j-1]=A[j];
             A[j]=pom;
            j--;

        }
        A[j+1]=p;
        i++;
    }
}

void selectsort(int n,int *A){
int i=n;
int j,max,p;
while(n>=2){
    j=2;
    max=A[1];
    p=1;
    while(j<=i){
        if(max<A[j]){
            max=A[j];
            p=j;
            j++;

        }
        A[p]=A[i];
        A[i]=max;
        i--;
    }
}
}

Nie działa funkcja bublesort,ponieważ w drugim casie nie widzi tablicy. Jak mogę obejść ten problem?

0

Prosta sprawa:
Tutaj tworzysz tablicę A:

case 1:
{
    printf("Podaj wielkosc tablicy: ");
    scanf("%d",&n);
    int A[n];                                        // Tablica powołana do życia
    wczytaj(n,A);
}                                                       // W tej linijce tablica zostaje usunięta
break;

Po czym program wychodzi z case 1 i tablica A zostaje usunięta z pamięci.

edit: Wytłumaczę -> Życie zmiennych ograniczone jest (na chłopski rozum mówiąc) do klamer { }, po wyjściu z których wszystkie zmienne w nich utworzone zostają usunięte i nie są już dostępne poza tymi klamrami.


Stwórz tą tablicę na początku funkcji main() i wtedy prawidłowo nią operuj.

0

Problem w tym, że dopiero tu wczytuje wielkość tabicy(n), to jak mam utworzyć tablice od n w programie głównym?

0

Wykorzystaj std::vector.

0
Patryk27 napisał(a):

Wykorzystaj std::vector.

A mógłbyś pokazać jak to będzie w tym przypadku?

1

Zamiast korzystać z VLA, skorzystaj z dynamicznego przydziału pamięci. Poczytaj o malloc(), free().

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <time.h>
#include <string.h>

int main(int argc, char *argv[]) {
    int *array = NULL;
    
    size_t array_size;
    printf("Enter size of array: ");
    scanf("%u", &array_size);
    
    array = malloc(array_size * sizeof(int));
    if (array == NULL) {
        fprintf(stderr, "[ERROR]: Can't allocate memory.\n");
        exit(EXIT_FAILURE);
    }
    
    printf("Enter values:\n");
    for (size_t i = 0; i < array_size; ++i) {
        printf("[%u] = ", i);
        scanf("%d", &array[i]);
    }
    
    printf("Array:\n");
    for (size_t i = 0; i < array_size; ++i) {
        printf("[%u] = %d\n", i, array[i]);
    }
    
    free(array);
    
    return EXIT_SUCCESS;
}

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