Тема: Сортування масиву із покажчиками на рядкові константи

Вітаю форумчани.
Я майже доробив програмку, яка б виконувала поставлене завдання, ось вона:

/* 
 * File:   main.cpp
 * Author: YaR
 *
 * Created on November 19, 2013, 12:04 PM
 */

#include <cstdlib> 
#include <iostream>
#include <cstring>

#define MAXLINES 50

using namespace std;

/*
 * 
 */

char *wArrayPtr[MAXLINES]; // Масив покажчиків на рядкові константи
void arrayFill(char *array_ptr, int size); // заповнення масиву
int arraySort(char *array_ptr, int size); // перетворення рядку на масив векторів
void my_qsort(void *v[], int left, int right, 
        int(*comp)(void *, void *)); // сортування масиву покажчиків
int strcmp_t(char *s1, char *s2); // алфавітне порівняння двох рядкових констант
void swap(void *v[], int i, int j); // зміна двох елементів масиву місцями



int main(int argc, char** argv) {
    int count;
    char nameOfStates[1000];
    
    arrayFill(nameOfStates, sizeof(nameOfStates));
    cout << "Array was filled by this text:\n" << nameOfStates << '\n';
    
    count = arraySort(nameOfStates, sizeof(nameOfStates));
    cout << "Main function:\n";
    cout << wArrayPtr[0] << "\n";
    cout << wArrayPtr[1] << "\n";

    return 0;
}

void arrayFill(char *array_ptr, int size){
    int i = 0;
    char statesNames[] = "Virginia\n"
                         "Texas\n"
                         "Oregon\n"
                         "Alabama\n"
                         "Dakota\n"
                         "California\n"
                         "Utah\n"
                         "Florida\n"
                         "Georgia\n"
                         "Pennsylvania\n"
                         "New Mexico\n"
                         "Nevada\n"
                         "Montana\n"
                         "\0" ;
    
    // Заповнення масиву
    while(i < size && statesNames[i] != '\0'){
        *array_ptr = statesNames[i++];
        array_ptr++;
    }
    
    // Видалення незакінченого слова
    if(*array_ptr != '\0'){
        while(*array_ptr != '\n' && i!=0){
            array_ptr--;
            i--;
        }  
    }
    
    // Додавання нуль-символу в кінець рядку
    if(*array_ptr == '\n'){
        array_ptr++;
    }
    *array_ptr = '\0';
}

int arraySort(char *array_ptr, int size){
    int i, j, k; // i - загальний лічильник для проходження по масиву
                       // j - номер слова із яким ми працюємо
                       // k - індекс для другого виміру масиву
    int count=0; // count - кількість слів в рядку
    
    // Розрахунок кількості слів
    i = 0;
    while(*(array_ptr+i) != '\0'){
        if(*(array_ptr+i) == '\n'){
            count++;
        }
        i++;
    }
    
    cout << "Number of words in array: " << count << "\n";
    
    char wordArray[count][30]; // Ініціалізація масиву векторів
    
    // Встановлення покажчиків на рядкові константи
    i = 0;
    j = 0;
    k = 0;
    while(*(array_ptr+i) != '\0'){
        if(*(array_ptr+i) != '\n'){
            wordArray[j][k] = *(array_ptr+i); // Запис слова в векторний масив
            k++;
        } else {
            wordArray[j][k] = '\0'; // Заміна переносу каретки на нуль-символ
            wArrayPtr[j] = wordArray[j];
            j++; // Новий вектор
            k=0;
        }
        i++;
    }
    
    // Сортування масиву
    my_qsort((void **) wArrayPtr, 0, count-1, (int (*)(void*, void*)) (strcmp_t));
    cout << "Array_sort function:\n";
    cout << wArrayPtr[0] << "\n";
    cout << wArrayPtr[1] << "\n";
    
    return count;
}

void my_qsort(void *v[], int left, int right, int(*comp)(void *, void *)){
    int i, last;
    void swap(void *v[], int i, int j);

    if (left >= right) /* do nothing if array contains */
        return; /* fewer than two elements */
 
    swap(v, left, (left + right)/2);
    last = left;
    
    for (i = left+1; i <= right; i++)
        if ((*comp)(v[i], v[left]) < 0)
            swap(v, ++last, i);
    
    swap(v, left, last);
    my_qsort(v, left, last-1, comp);
    my_qsort(v, last+1, right, comp);
}

int strcmp_t(char *s1, char *s2){
    for( ; *s1 == *s2; s1++, s2++)
        if(*s1 == '\0')
            return 0;
    return *s1 - *s2;
}

void swap(void *v[], int i, int j){
    void *temp;
    
    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
}

Вивід програми такий:

Array was filled by this text:
Virginia
Texas
Oregon
Alabama
Dakota
California
Utah
Florida
Georgia
Pennsylvania
New Mexico
Nevada
Montana

Number of words in array: 13
Array_sort function:
Alabama
California
Main function:
;


RUN SUCCESSFUL (total time: 103ms)

Я не розумію, чому в main() відбувається інший вивід, поясніть будь ласка.

Білий Лунь

2 Востаннє редагувалося Ярослав (20.11.2013 20:45:23)

Re: Сортування масиву із покажчиками на рядкові константи

Все виявилось дуже просто! Покажчики із масиву wArrayPtr вказували на рядкові константи масиву wordArray, який існував тільки коли викликалась функція arraySort(), розібрався завдяки зневаджувачу.

Білий Лунь
Подякували: Chemist-i1

3

Re: Сортування масиву із покажчиками на рядкові константи

Ярослав написав:

Все виявилось дуже просто! Покажчики із масиву wArrayPtr вказували на рядкові константи масиву wordArray, який існував тільки коли викликалась функція arraySort(), розібрався завдяки зневаджувачу.

Прихований текст
зневаджувачу?
pew pew :D
Блоґ

4

Re: Сортування масиву із покажчиками на рядкові константи

дебагер

5

Re: Сортування масиву із покажчиками на рядкові константи

зневаджувач це синонім до знежучувача і знеметеликувача

Бодай вас Бог любив, а мене – молодиці!
Подякували: Bartash1