Форум программистов, компьютерный форум CyberForum.ru

Разыменовывание воид указателей, хранящихся в массиве - C++

Восстановить пароль Регистрация
 
WinstonCherchil
 Аватар для WinstonCherchil
7 / 7 / 0
Регистрация: 20.01.2011
Сообщений: 73
28.06.2013, 18:39     Разыменовывание воид указателей, хранящихся в массиве #1
Всем привет.
Ситуация такая. Мой компилятор умирает с segmentation fault когда я пытаюсь откомпилировать код в котором я объявляю структуру с 2 указателями на объекты моего класса. (нужно для передачи в поток). Если бы не это - пользовался бы указателем на структуру и радовался. По этому пришлось использовать массив указателей.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main(){
//исправный код...
    LineageMessages netCmds(16,16);
    LineageMessages serverConnection(128, 10240); //Мой класс
    void * pt[2] ={(void *)&netCmds, (void *)&serverConnection};
    cout << pt[0] << endl; //дебаг
//исправный код...
    HANDLE pushMThread = CreateThread(NULL, 0, pushMessages, pt, 0, NULL);
//исправный код...
}
 
unsigned long WINAPI pushMessages(void * _in){
 
    LineageMessages * netCmds = (LineageMessages *)((void *)((unsigned long long *)(_in))[0]);
    cout << netCmds << endl;
    //исправный код...
}
Прошу помочь улучшить читаемость кода на последней строчке (которая на Лисп похожа). Я Только так придумать смог.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2013, 18:39     Разыменовывание воид указателей, хранящихся в массиве
Посмотрите здесь:

C++,шаблон,специализация,поиск самой большой строки в массиве указателей на char C++
C++ Разыменовывание массива указателей
Изменить порядок следования элементов в массиве на обратный, используя массив указателей C++
Сортировка указателей в массиве C++
C++ Освобождение памяти из под Объектов в статическом массиве указателей
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
28.06.2013, 20:15     Разыменовывание воид указателей, хранящихся в массиве #2
Ты пользуешься жуткими непереносимыми хаками, конечно же код выглядит нечитаемо. А лисп лаконичен и изящен.
Показывай исходный код, проблема в нем, а не в этом костыле.

Кстати, это не единственная проблема. Ты передаешь указатели на локальные переменные, которые уже не существуют к моменту входа в pushMessages.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
struct Message {
    const char* text;
};
 
void pushMessages(void* in) {
    auto** arr = reinterpret_cast<Message**>(in);
 
    std::clog << arr[0]->text << '\n' << arr[1]->text << '\n';
 
    delete arr[0];
    delete arr[1];
}
 
int main() {
    auto* msg1 = new Message { "message one" };
    auto* msg2 = new Message { "message two" };
 
    Message* arr[] = { msg1, msg2 };
 
    pushMessages(arr);
 
    return 0;
}
WinstonCherchil
 Аватар для WinstonCherchil
7 / 7 / 0
Регистрация: 20.01.2011
Сообщений: 73
28.06.2013, 20:19  [ТС]     Разыменовывание воид указателей, хранящихся в массиве #3
Мне не понятно зачем Вам остальной код. Я вроде уточнил что проблема со структрой заключалась не в том, что компилятор ругается на синтаксические ошибки, а в том что компилятор умирал во время компилиции, сообщив о Segmentation fault.
Bash
1
internal compiler error: Segmentation fault
Почему я уверен, что дело именно в структуре? Потому что я её закоментировал и компилятор смог без ошибок собрать прогу. Структуру можно было использовать, но там кастыль получался на 10 строк. По этому решил через массив.

Вот код, который Вы просили.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
 * File:   main.cpp
 * Author: Winston
 *
 * Created on 1 Январь 2013 г., 0:48
 */
 
 
 
 
#include <iostream>
#include <winsock2.h>
#include <windows.h>
#include <thread>
#include "LineageMessages.h"
#include "classConfig.h"
#include "classAI.h"
#define MAX_CONN 63
 
unsigned long WINAPI pushMessages(void *);
 
 
using std::cout; using std::endl; using std::cin;
 
 
int main(){
 
    LineageMessages netCmds(16,16);
    LineageMessages serverConnection(128, 10240);
    void * pt[2] ={(void *)&netCmds, (void *)&serverConnection};
    /*
    запускаем сетевой и AI процессы.
    Запускаем цикл командного интерпретатора.
    */
    cout << "Good day! This is HiveMind control console. Type commands to control bots" <<
            endl << "or type 'help' if you are not familiar with this program. GL/HF" << endl;
    HANDLE AIThreadHandle = CreateThread(NULL, 0, mainAITread, nullptr, 0, NULL);
    HANDLE pushMThread = CreateThread(NULL, 0, pushMessages, pt, 0, NULL);
    //cout << pt[0] << " " << pt[1] << endl;
    char cmd[64] = { 0 };
    unsigned char msg[16] {0};
    unsigned char servMsg[10240] {0};
    while (!cin.fail()) {
        cin.getline(cmd, 64);
        cout << endl;
// TODO (Winston#1#): Запилить интерпретатор команд
 
        if (strcmp (cmd,"quit")== 0){
            cout << "Are you sure? All your connections will be lost. (y/n):" ;
            cin.getline(cmd, 64);
            if(!cin.fail() and ((strcmp (cmd,"y")== 0) or (strcmp (cmd,"Y")== 0))){
                msg[0] = 0; msg[1] = 0;
                netCmds.push(msg, 16, 0);
                Sleep(1000);
                cout << "Bye!" << endl;
                break;
            }
        }
        else if (strcmp (cmd,"connect")== 0){
            //сообщаем в netCmds что надо создать подключение...
            msg[0] = 0; msg[1] = 1;
            netCmds.push(msg, 16, 0);
        }
        else if (strcmp (cmd,"disconnect")== 0){
            msg[0] = 0; msg[1] = 2;
            netCmds.push(msg, 16, 0);
 
        }
        else if (strcmp (cmd,"stop")== 0){
            msg[0] = 0; msg[1] = 3;
            netCmds.push(msg, 16, 0);
 
        }
        else {
            cout << "Pleaze enter valid command: ";
        }
    }
    CloseHandle(AIThreadHandle);
    CloseHandle(pushMThread);
 
    return 0;
}
 
unsigned long WINAPI pushMessages(void * _in){
 
    WSADATA wsa = { 0 };
    SOCKET client_socket[63];
    WSAEVENT updateEvents[63];
    WSAEVENT * pUpdateEvents[63] = { nullptr };
 
    if(WSAStartup(MAKEWORD(2, 2), &wsa)){ //инициализуем библиотеки...
        cout << "Some error occurred!" << endl;
        return 1;
    }
 
    for(int i = 0; i < MAX_CONN; i++){
         //подготовка сокетов к подключению...
        client_socket[i] = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        updateEvents[i] = WSACreateEvent();
        //Проверять сокеты будем в цикле перед подключением
    }
    int owners[63];
    LineageMessages * netCmds = (LineageMessages *)((void *)((unsigned long long *)(_in))[0]);
    LineageMessages * serverConnection = (LineageMessages *)((void *)((unsigned long long *)(_in))[1]);
    //cout << netCmds << " " << serverConnection << endl;
    bool goOn = true;
    unsigned char netMsg[16];
    unsigned char netBuffer[10240];
    unsigned int sz;
    int owner;
    while(goOn){
        Sleep(200);
        if(!netCmds->isEmpty()){
            netCmds->pull(netMsg, sz, owner);
            if(netMsg[1] == 1){
                cout << "Connecting..." << endl;
 
            }
            else if(netMsg[1] == 2){
                cout << "Disconnecting..." << endl;
            }
            else if(netMsg[1] == 0){
                goOn = false;
            }
        }
    }
    cout << "Exitting network..." << endl;
    return 0;
}
P.S. По хорошему надо компилятор обновить или заменить. Но я к этому уже привык.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
28.06.2013, 20:22     Разыменовывание воид указателей, хранящихся в массиве #4
Читай внимательно мой пост.
Нужно пользоваться самым актуальным на текущий момент компилятором, а не тем, к которому "привык".
WinstonCherchil
 Аватар для WinstonCherchil
7 / 7 / 0
Регистрация: 20.01.2011
Сообщений: 73
28.06.2013, 20:25  [ТС]     Разыменовывание воид указателей, хранящихся в массиве #5
С локальными переменными проблем быть не должно, потому что они живут столько же сколько и функция main.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
28.06.2013, 20:27     Разыменовывание воид указателей, хранящихся в массиве #6
Я тебе код привел, который отлично работает.
Yandex
Объявления
28.06.2013, 20:27     Разыменовывание воид указателей, хранящихся в массиве
Ответ Создать тему
Опции темы

Текущее время: 01:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru