[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. TITO

    TITO New Member

    Joined:
    30 Sep 2010
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Здравствуйте, уважаемые. У меня есть задача, необходимо собрать из нескольких байт хранящихся в массиве данных, число.
    Конкретнее у меня есть массив с 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);
    }
    Хочу узнать правильно ли я делаю?
     
  2. bad_boy

    bad_boy Elder - Старейшина

    Joined:
    30 Dec 2004
    Messages:
    187
    Likes Received:
    33
    Reputations:
    3
    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
    
    Обычно пишут более компактно, вторым вариантом.
     
  3. gold-goblin

    gold-goblin Elder - Старейшина

    Joined:
    26 Mar 2007
    Messages:
    917
    Likes Received:
    174
    Reputations:
    3
    В общем начал изучать Си и дошел до функций. Сразу возникла не понятка, почему функция не выполняется?
    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
     
  4. Vollkorn

    Vollkorn Member

    Joined:
    6 Nov 2010
    Messages:
    86
    Likes Received:
    15
    Reputations:
    -6
    gold-goblin,
    во-первых, ты создал функцию, но ты её не вызываешь.
    во-вторых, i = ++i, как это понимать? i = инкремент i? можно ж просто ++i.
    в-третьих, как то не очень понял смысл while (one == two), проще это сделать for'ами.

    Я хотел написать тебе эту прогу, но не вкупил, что она делает?)

    PS, а разве можно объявлять функцию в функции?
     
    #5924 Vollkorn, 9 Dec 2010
    Last edited: 9 Dec 2010
    1 person likes this.
  5. nitx

    nitx Elder - Старейшина

    Joined:
    4 Jan 2008
    Messages:
    214
    Likes Received:
    31
    Reputations:
    10
    это че, стандарты поменяли и мне об этом не сказали?
    upd, всетаки загуглил, да, так можно но как-то не по фен-шую. Кстати, ты знаешь, что у тебя возвращаться будет только последняя переменная?

    upd2,
    Code:
           while (one == two)
           {
               i2 = ++i2;
               printf (" %d", mass2[i2]);
        }
    
    цикл не закрыт. Блин, как так можно не читать понятные ошибки компилятора?
    Да, и код написан ужасно, больше не буду это читать.
     
    #5925 nitx, 9 Dec 2010
    Last edited: 9 Dec 2010
  6. gold-goblin

    gold-goblin Elder - Старейшина

    Joined:
    26 Mar 2007
    Messages:
    917
    Likes Received:
    174
    Reputations:
    3
    Я перед всеми извиняюсь.... Аж как то стыдно...
    Можешь объяснить или сказать что почитать? Читаю Язык программирования Си 2 издание (Кернинган, Ритчи).
    Об этом не знал, спасибо!
    Дурная голова рукам покоя не дает. =( Спасибо!
    Спасибо но не надо! Я сам хочу вкурить =)

    Нельзя...
    Просто вчера плохо себя чувствовал и пытался поучить Си, как понял из этого ничего хорошего не выйдет..
    Приеду домой и перепишу всю прогу.
     
  7. bad_boy

    bad_boy Elder - Старейшина

    Joined:
    30 Dec 2004
    Messages:
    187
    Likes Received:
    33
    Reputations:
    3
    Книжка правильная. Продолжай её читать, только внимательнее.
     
  8. VulturRe

    VulturRe Member

    Joined:
    9 Dec 2010
    Messages:
    59
    Likes Received:
    6
    Reputations:
    0
    у меня закрывает программу после того как я нажимаю enter. в чём дело?
     
  9. Jakeroid

    Jakeroid Member

    Joined:
    9 May 2009
    Messages:
    199
    Likes Received:
    12
    Reputations:
    1
    Вопрос тысячу раз уже обсуждался, исопльзуйте поиск.
    Code:
    SYSTEM('PAUSE');
    Кажется так)
     
  10. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Code:
    system("pause");
    а не
    Code:
    SYSTEM('PAUSE');
     
  11. Gin

    Gin Elder - Старейшина

    Joined:
    11 Sep 2008
    Messages:
    133
    Likes Received:
    7
    Reputations:
    4
    Пишу простенькую тулзу на чек контента 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);
    
     
  12. Gin

    Gin Elder - Старейшина

    Joined:
    11 Sep 2008
    Messages:
    133
    Likes Received:
    7
    Reputations:
    4
    ответ найден, тут просто получается классическая схема deadlock'а, тогда наверное следующий вопрос, как правильно освободить ресурсы, как мне кажется сразу после создания потоков нельзя закрывать хендлы, тогда где лучше это сделать :?
     
  13. zeppe1in

    zeppe1in Elder - Старейшина

    Joined:
    12 Jul 2006
    Messages:
    343
    Likes Received:
    66
    Reputations:
    18
    можно. закрывай тогда когда они тебе больше не нужны. Если не нужны вообще то закрывай сразу.
    я бы на твоём месте сделал так, создал поток в котором код который ты написал. а он уже создавал бы другие потоки, ждал завершения их и говорил об этом.
    И диалог не висит и из потоков можно ход работы выводить.
     
  14. Gin

    Gin Elder - Старейшина

    Joined:
    11 Sep 2008
    Messages:
    133
    Likes Received:
    7
    Reputations:
    4
    2zeppe1in

    а когда я закрываю хендлы нужно мне их освобождать из кучи т.е
    delete[] hThreads;
    делать :?

    и еще вопрос отчего может так быть первый раз прочекивается все нормально, а при повторном событии ID_OK1 ничего не происходит:?
     
  15. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    как решить проблему цикличного подключение хедеров ?

    есть test1.hpp он пдключает test2.hpp. В свою очередь test2.hpp должен подключать test1.hpp. Но если это сделать то ничего не собирается (ошибки выдаются на сожержимое test1 и test2 из друг друга они не видят содержимое соседа)

    каждый хедер по правилам испольузет #ifndef #define #endif,...

    зачем оно так сделано. В каждом из хедеров определена своя сущность (класс) каждый из классом содержит указатель на другой класс. Вот так оно все печально.
     
  16. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Пример кода нужен. Если там просто указатель, то достаточно объявление класса без его определения сделать, и тогда файлы друг в друга включать не надо будет.
     
  17. bad_boy

    bad_boy Elder - Старейшина

    Joined:
    30 Dec 2004
    Messages:
    187
    Likes Received:
    33
    Reputations:
    3
    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
     
    #5937 bad_boy, 14 Dec 2010
    Last edited: 14 Dec 2010
  18. bad_boy

    bad_boy Elder - Старейшина

    Joined:
    30 Dec 2004
    Messages:
    187
    Likes Received:
    33
    Reputations:
    3
    Gin
    Из MSDN
    Внутри треда ставь _endthread и даже не получай хэндлы потоков.
     
  19. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    Привожу пример, с сохранением логики проблемной задачи
    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, сразу отбросил сею глупую идею, но забыл про пустое объявление класса :)

    А если не только указатели используются ?
     
  20. Dimon32

    Dimon32 New Member

    Joined:
    6 May 2010
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    подпрограмму суммирования любого количества целых чисел

    Как реализовать подпрограмму суммирования любого количества целых чисел с ручным разбором параметров в терминах библиотеки 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); }
    Не получается!! :confused:
     
Thread Status:
Not open for further replies.