HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #2871  
Старый 02.05.2009, 15:37
eLWAux
Постоянный
Регистрация: 15.06.2008
Сообщений: 941
С нами: 9423746

Репутация: 2399


По умолчанию

как-то так.. )
Код:
#include <windows.h>
#include <stdio.h>
#include <string>

using namespace std;
#define MAX_PATH 512

// если найдено ".." или "." - пропускаем
bool is_dots(const char* dir){
        if (strcmp(dir, ".")==0) return true;
        if (strcmp(dir, "..")==0) return true;
        return false;
}

// рекурс. скан. директории
void scan_directory(const char* dir, const char* mask){

        char filemask[MAX_PATH];
        char temp[MAX_PATH];
        sprintf(filemask, "%s\\%s", dir, mask); // полный путь в filemask

        WIN32_FIND_DATA wf;
        HANDLE hf = FindFirstFile(filemask, &wf); // ищем первый
        if (hf != INVALID_HANDLE_VALUE){
                do{
                        if (!is_dots(wf.cFileName)){ // если найдено не ".." или "."
                                if (wf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){ // если найдено папку
                                        char buf[MAX_PATH];     
                                        sprintf(buf, "%s\\%s", dir, wf.cFileName);
                                        scan_directory(buf, mask);      // вызываем сами себя
                                }
                                else {
                                        if (strcmp(wf.cFileName, ".exe")>=0) { // если в имени ".ехе"
                                           sprintf("%s\\%s", temp, dir, wf.cFileName);
                                           WinExec(temp,SW_SHOW); // запускаем файл
                                        }
                                }
                                        
                        }
                }while (FindNextFile(hf, &wf)); // ищем след.
                FindClose(hf); // конец поиска
        }
}

int main(int argc, char** argv){
        WIN32_FIND_DATA wf;
        scan_directory("С:", "*.exe");
        return 0;
}
 
Ответить с цитированием

  #2872  
Старый 02.05.2009, 22:16
Дикс
Познавший АНТИЧАТ
Регистрация: 16.04.2006
Сообщений: 1,488
С нами: 10562786

Репутация: 537


По умолчанию

в книге "С++ за 21 день" после выделения и удаления динамической памяти
PHP код:
int *num = new int;
delete num
рекомендуется обязательно приравнять указатель к нулю
PHP код:
*num 0
я использую связку Eclipse + плагин С++ + minGW.
И там даже без последней строчки указатель всегда становится равен нулю.

Как вы считаете, рекомендация ставить 0 - архаизм или же нельзя это игнорировать, только потому что мой компилятор делает это за меня.
 
Ответить с цитированием

  #2873  
Старый 02.05.2009, 22:40
desTiny
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
С нами: 10139366

Репутация: 1502


По умолчанию

>>рекомендуется обязательно приравнять указатель к нулю

а зачем - там не написано?
__________________
Bedankt euch dafür bei euch selbst.

H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
 
Ответить с цитированием

  #2874  
Старый 02.05.2009, 23:04
Дикс
Познавший АНТИЧАТ
Регистрация: 16.04.2006
Сообщений: 1,488
С нами: 10562786

Репутация: 537


По умолчанию

написано, что если обращаться к указателю у которого память уже высвобождена delete-ом, но не присвоен нуль - будут самые неявные ошибки, вплоть до зависания.

а мой компилятор сам приравнивает к нулю.

хочу понять - щас все компиляторы уже это делают, или тока мой имеет такую фичу.
 
Ответить с цитированием

  #2875  
Старый 03.05.2009, 00:04
razb
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
С нами: 9017461

Репутация: 414


По умолчанию

я не уверен но вроде по стандарту после вызова delete/delete[] указатель становится равным NULL, во всяком случае надо глянуть стандарт, а на компилятор полагатся не стоит.
 
Ответить с цитированием

  #2876  
Старый 03.05.2009, 19:29
Ra$cal
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
С нами: 10386906

Репутация: 599


По умолчанию

в стандарте не указано. поэтому лучше прравнивать, а еще лучше исользовать умные указатели. это спасет от утечек памяти.
 
Ответить с цитированием

  #2877  
Старый 04.05.2009, 12:03
s_p_a_m
Участник форума
Регистрация: 08.02.2008
Сообщений: 116
С нами: 9607837

Репутация: 158
По умолчанию

пытаюсь скомпилить код, пишет ошибку " Не удается открыть файл include: math: No such file or directory" в чем может быть проблема ? (microsoft visual C++ 2008 express)
Код:
#include <iostream>
#include <math>               
#include <stdio>              
#include <conio>              
#include <stdlib>                    
#include <string>               
using namespace std;

 unsigned long dec=0;                 
 int oct[10],bin[10],hex[10];                
 int len=0;                    
 int count=0;                    
 char *vosm_strchar*)malloc(sizeof(char));         

 vvod()                                   
  {
    scanf("%s",vosm_str);                   
    for(int i=0;vosm_str[i];i+                        
     {
      oct[i]=vosm_str[i]-0x30;                    
       if((vosm_str[i]<'0')||(vosm_str[i]>'7'))          
     return 1;                         
     }
    len=i;                              
    return 0;                              
  }

void todec()                       
 {
  for(int i=0;i<len;i+
   dec+oct[i]*(pow(8,len-i-1)));          
 }

void tobin()                    
 {
   for(int i=0;i<len;i+
    switch(oct[i])                     
     {
     case 0: bin[i]=0;break;          
     case 1: bin[i]=1;break;          
     case 2: bin[i]=10;break;
     case 3: bin[i]=11;break;
     case 4: bin[i]=100;break;
     case 5: bin[i]=101;break;
     case 6: bin[i]=110;break;
     case 7: bin[i]=111;break;
     }
  }

void tohex()                    
 {
  int i=0;
  double temp = dec;                   
   while(temp>=16)              
   {
    hex[i]=16*(modf(temp/16, &temp));   
    i++;                                
    count++;                            
    switch(int(hex[i]))
     {
      case 10: hex[i]=0xA;break;        
      case 11: hex[i]=0xB;break;        
      case 12: hex[i]=0xC;break;
      case 13: hex[i]=0xD;break;
      case 14: hex[i]=0xE;break;
      case 15: hex[i]=0xF;break;
     }
   }
   hex[i]=temp;                    
 }

void vuvod()                    
 {
  printf("\nChislo v  8-ou s.s. = %s",vosm_str);
  printf("\nChislo v 10-ou s.s. = %ld",dec);
  printf("\nChislo v  2-ou s.s. = ");
   for(int i=0;i<len;i+               
    printf("%.3d",bin[i]);              
  printf("\nChislo v 16-ou s.s. = ");
   for(i=count;i>=0;i--)              
    printf("%X",int(hex[i]));          
 }

void main()
 {
  clrscr();
   if(vvod()==0)                 
    {
     todec();
     tobin();
     tohex();
     vuvod();
    }
   else
    puts("Chislo zapizano ne v 8-ou s.s.");
  getch();
                 
 }

Последний раз редактировалось s_p_a_m; 04.05.2009 в 12:09..
 
Ответить с цитированием

  #2878  
Старый 04.05.2009, 12:14
slesh
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
С нами: 10097606

Репутация: 3349


По умолчанию

в отсутствии файла math ))
попробуй написать math.h
или возьми его из другой версии типа VC++ 6.0
МЫ 2008 сильно урезан во многих модулях. хотя этот должен быть
 
Ответить с цитированием

  #2879  
Старый 04.05.2009, 13:28
razb
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
С нами: 9017461

Репутация: 414


По умолчанию

Цитата:
в отсутствии файла math ))
попробуй написать math.h
В с++ в названиях всех сишных хэдэров должен быть префикс "c",
example:
#include <cstdio>
#include <cstring>

Цитата:
или возьми его из другой версии типа VC++ 6.0
МЫ 2008 сильно урезан во многих модулях. хотя этот должен быть
не имеют права это хэдэр со стандартной либы) каким бы не был экспресс билд, стандарт он должен поддерживать полностью.

Последний раз редактировалось razb; 04.05.2009 в 13:34..
 
Ответить с цитированием

  #2880  
Старый 04.05.2009, 14:20
s_p_a_m
Участник форума
Регистрация: 08.02.2008
Сообщений: 116
С нами: 9607837

Репутация: 158
По умолчанию

Цитата:
Сообщение от razb  
В с++ в названиях всех сишных хэдэров должен быть префикс "c",
example:
#include <cstdio>
#include <cstring>


не имеют права это хэдэр со стандартной либы) каким бы не был экспресс билд, стандарт он должен поддерживать полностью.
Не удается открыть файл include: conio: No such file or directory уже как только не писал,и #include <conio>, и #include <cconio>, бесполезно
 
Ответить с цитированием
Ответ



Предыдущая тема Следующая тема
Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Часто задаваемые вопросы по MySQL Серый PHP 5 28.12.2006 18:26
Интернетчики задали российскому президенту очень странные вопросы podkashey Мировые новости. Обсуждения. 4 07.07.2006 16:53
Вопросы по Ipb 2.0 Voodoo_People Уязвимости CMS / форумов 26 15.02.2005 22:57



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.