Здравствуйте, уважаемые. У меня есть задача, необходимо собрать из нескольких байт хранящихся в массиве данных, число. Конкретнее у меня есть массив с 3 элементами, каждый байт в этом массиве имеет 7 значимых бит(8 незначимый). Мне необходимо из этих 3х байт собрать число. Как я делаю. Код: Code: long chislo; int n; int data_f=[1,2,3]; int main (void) { chislo=data_f[1]; // считываю первый байт массива в число cchislo<<=8; // сдвигаю на 8 бит влево, освобождаю под следующую цифру chnl0|=data_f[2]; // записываю след цифру массива в число chnl0<<=8; // опять сдвигаю chnl0|=data_f[3]; // опять записываю printf("%d chislo",chislo); } Хочу узнать правильно ли я делаю?
TITO, в общем-то, да. Code: chislo=data_f[1]; 0x00000001 cchislo<<=8; 0x00000100 chnl0|=data_f[2]; 0x00000102 chnl0<<=8; 0x00010200 chnl0|=data_f[3]; 0x00010203 chislo = data_f[1] << 16 | data_f[2] << 8 | data_f[3]; 0x00010000 | 0x00000200 | 0x00000003 = 0x00010203 Обычно пишут более компактно, вторым вариантом.
В общем начал изучать Си и дошел до функций. Сразу возникла не понятка, почему функция не выполняется? Code: #include <stdio.h> int main() { int mass[12], i, one, two, i2, mass2[12]; printf("Массив в 10 едениц создан\n"); one = 2; two = 9; i = 0; while (i != 10) { i = ++i; mass[i] = 0; } printf("Массив полностью забит нулями\n"); printf("выведем массив полностью\n"); i = 0; while (i != 10) { i = ++i; printf(" %d", mass[i]); } printf("работа подпрограммы создания массива завершена\n"); int masp (int one, int two, int mass[]) { int mass2[12], i, i2; i = 0; printf ("Выводим элементы массива с %d по %d\n", one, two); while (one == two) { printf ("Записываем %d элемент массива mass в массив mass2 под номером %d\n", one, i); mass2[i] = mass[one]; } printf("Функция выполнена!\n"); return mass2, one, two; } printf("Выводим получившийся массив:\n"); i2 = 0; while (one == two) { i2 = ++i2; printf (" %d", mass2[i2]); } return 0; } Использую gcc
gold-goblin, во-первых, ты создал функцию, но ты её не вызываешь. во-вторых, i = ++i, как это понимать? i = инкремент i? можно ж просто ++i. в-третьих, как то не очень понял смысл while (one == two), проще это сделать for'ами. Я хотел написать тебе эту прогу, но не вкупил, что она делает?) PS, а разве можно объявлять функцию в функции?
это че, стандарты поменяли и мне об этом не сказали? upd, всетаки загуглил, да, так можно но как-то не по фен-шую. Кстати, ты знаешь, что у тебя возвращаться будет только последняя переменная? upd2, Code: while (one == two) { i2 = ++i2; printf (" %d", mass2[i2]); } цикл не закрыт. Блин, как так можно не читать понятные ошибки компилятора? Да, и код написан ужасно, больше не буду это читать.
Я перед всеми извиняюсь.... Аж как то стыдно... Можешь объяснить или сказать что почитать? Читаю Язык программирования Си 2 издание (Кернинган, Ритчи). Об этом не знал, спасибо! Дурная голова рукам покоя не дает. =( Спасибо! Спасибо но не надо! Я сам хочу вкурить =) Нельзя... Просто вчера плохо себя чувствовал и пытался поучить Си, как понял из этого ничего хорошего не выйдет.. Приеду домой и перепишу всю прогу.
Пишу простенькую тулзу на чек контента WINAPI + C/C++ столкнулся с проблемой, когда щелкаю на кнопку, форма зависает и не реагирует пока чек не закончится, подскажите рецепт как оставить форму активной, что бы реагировала на события. Вот код (под формой здесь понимается диалоговое окно созданное в редакторе ресурсов) Code: void DlgOnCommand(HWND hwnd,int id ,HWND,UINT) { switch(id){ case IDOK1: char szText[256]; GetWindowTextA(GetDlgItem(hwnd,IDC_EDIT1),szText,255); findinstr=szText; if(findinstr==""){ MessageBoxA(NULL,"Введи строку для поиска","Msg",MB_OK); }else{ if(nThreads>items) nThreads=items; HANDLE *hThreads = new HANDLE[nThreads]; unsigned *uThreadIDs=new unsigned[nThreads]; for(int i=0; i<nThreads;i++) hThreads[i] = (HANDLE)_beginthreadex( NULL, 0, &ThreadFunc, NULL, 0,&uThreadIDs[i]); WaitForMultipleObjects(nThreads, hThreads, TRUE, INFINITE ); for(int i=0; i<nThreads;i++) CloseHandle( hThreads[i] ); } } } и еще трабла в функции потока пытаюсь выводить данные используя критические секции, там вообще беда если вставляешь строки форма вообще из дауна не выходит Code: EnterCriticalSection(&cs); wsprintfA(StaticText,"good/bad/error: %d/%d/%d",good,bad,error); SetWindowTextA(GetDlgItem(hwndfunc,IDC_STATIC1),StaticText); LeaveCriticalSection(&cs);
ответ найден, тут просто получается классическая схема deadlock'а, тогда наверное следующий вопрос, как правильно освободить ресурсы, как мне кажется сразу после создания потоков нельзя закрывать хендлы, тогда где лучше это сделать :?
можно. закрывай тогда когда они тебе больше не нужны. Если не нужны вообще то закрывай сразу. я бы на твоём месте сделал так, создал поток в котором код который ты написал. а он уже создавал бы другие потоки, ждал завершения их и говорил об этом. И диалог не висит и из потоков можно ход работы выводить.
2zeppe1in а когда я закрываю хендлы нужно мне их освобождать из кучи т.е delete[] hThreads; делать :? и еще вопрос отчего может так быть первый раз прочекивается все нормально, а при повторном событии ID_OK1 ничего не происходит:?
как решить проблему цикличного подключение хедеров ? есть test1.hpp он пдключает test2.hpp. В свою очередь test2.hpp должен подключать test1.hpp. Но если это сделать то ничего не собирается (ошибки выдаются на сожержимое test1 и test2 из друг друга они не видят содержимое соседа) каждый хедер по правилам испольузет #ifndef #define #endif,... зачем оно так сделано. В каждом из хедеров определена своя сущность (класс) каждый из классом содержит указатель на другой класс. Вот так оно все печально.
Пример кода нужен. Если там просто указатель, то достаточно объявление класса без его определения сделать, и тогда файлы друг в друга включать не надо будет.
cupper, test1.hpp Code: #ifndef __TEST1_HPP__ #define __TEST1_HPP__ //твой код #endif test2.hpp Code: #ifndef __TEST2_HPP__ #define __TEST2_HPP__ //твой код #endif Если будет ругаться на #ifndef __TEST1_HPP__, то можно заменить на #if !defined(__TEST1_HPP__) В VS можно писать #pragma once
Привожу пример, с сохранением логики проблемной задачи test1.hpp Code: #ifndef __TEST_1__ #define __TEST_1__ #include "test2.h" #include <vector> class Address { std::vector<Persone> address; }; #endif test2.hpp Code: #ifndef __TEST_2__ #define __TEST_2__ #include "test1.h" #include <vector> class Persone { std::vector<Address> address; }; #endif main.cpp Code: #include "test1.h" #include "test2.h" int main() { return 0; } т.е. Имеется класс описывающий сущность Персона и класс описывающий сущность Адрес. Одна персона может быть связанная с несколькими адресами. Один адрес может быть связан с несколькими персонами. Так как заведомо не известно что будет являться целью работы пользователя (работа с адресами или с персонами) то по хорошему нужно в каждом из классов хранить указатель на вектор указателей значений другого класса. Например чтобы узнать всех людей проживающих по данному адресу. Или все адреса на которых проживает данный человек (в примере это опущено) Вот такой пример при сборке выдает ошибку. Если в одном из хедеров (не важно в каком) отключить другой хедер и избавиться от упоминания описываемого в отключаемом хедере классе, то все собирается. Code: #ifndef __TEST_1__ #define __TEST_1__ #include <vector> class Persone; class Address { std::vector<Persone> address; }; #endif Вот я блин выдал подумал что нужно это как то так сделать, но в голове сразу закрутился extern, сразу отбросил сею глупую идею, но забыл про пустое объявление класса А если не только указатели используются ?
подпрограмму суммирования любого количества целых чисел Как реализовать подпрограмму суммирования любого количества целых чисел с ручным разбором параметров в терминах библиотеки stdarg.h ? Пробовал так: Code: #include <stdio.h> #include <stdarg.h> #include <conio.h> int sum (int x, ...); int main() { int s=sum(2,2,2); printf("%d",s); getch(); } int sum (int x, ...) { int i=0, j=0, suma=0; // установка указателя uk_arg на первый необязятельный параметр va_list spisok; va_start(spisok,x); // проверка на пустоту списка if (x!=-1) suma=x; else return (0); j++; // суммирование элементов по циклу while ( (i=va_arg(spisok,int))!=-1) //va_arg обеспечивает доступ к текущему параметру вызываемой функции { suma+=i; j++; } va_end(spisok); //делает очистку всего return (suma); } Не получается!!