MV Studio Express 2012, компилятор си не разрешает объявлять переменные вне начала функции - C (СИ)
Формулировка задачи:
компилятор си не разрешает объявлять переменные вне начала функции. по googlu 99 версия компилятора. вопрос? как это исправить в MV Studio 2012.+ У меня MV Studio Express 2012: пишу на си. вопрос? как сделать так, что-бы объявлять переменные и константы, а также их инициировать, не только в начале функции, как того требует стандарт C99, может где настройки какие. может другой компилятор нужен? заранее спасибо.
Решение задачи: «MV Studio Express 2012, компилятор си не разрешает объявлять переменные вне начала функции»
textual
Листинг программы
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h></windows.h>
#include <stdio.h></stdio.h>
//#include <stdlib.h></stdlib.h>
//#include <string.h></string.h>
int main()
{
HANDLE hFile; // я могу объявить переменные в начале функции
BOOL Boolean=TRUE;
DWORD lpNumberOfBytesWrite;
int error, size;
char *Psf;
char strNameFile[128];
char strPatchFile[132]={"C:\\"};
printf("C:\\");
scanf("%132s", strNameFile);
strcat(strPatchFile, strNameFile);
hFile=CreateFile(strPatchFile, // адрес строки имени файла
GENERIC_READ, // режим доступа
0, // режим совместного использования файла
NULL, // дескриптор защиты
OPEN_ALWAYS, // параметры создания
FILE_ATTRIBUTE_NORMAL, // атрибуты файла
NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("Could not open file.");
return 0;
}
int i; // но здесь происходит ошибка
size=GetFileSize(hFile, // идентификатор файла
NULL); // адрес старшего слова для
// размера файла
error=GetLastError();
printf("error: %d \n", error);
Psf=(char*)malloc(size*sizeof(char));
Boolean=ReadFile(hFile, // идентификатор файла
Psf, // адрес записываемого блока данных
size*sizeof(char), // количество байт, которые
// необходимо записать
&lpNumberOfBytesWrite, // адрес слова, в котором
// будет сохранено количество записанных байт
NULL); // адрес структуры типа OVERLAPPED
CloseHandle(hFile);
//**********************************************************************************
hFile=CreateFile("C:\\text.txt", // адрес строки имени файла
GENERIC_WRITE, // режим доступа
0, // режим совместного использования файла
NULL, // дескриптор защиты
CREATE_ALWAYS, // параметры создания
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("Could not open file.");
return 0;
}
Boolean=WriteFile(hFile, // идентификатор файла
Psf, // адрес записываемого блока данных
size*sizeof(char), // количество байт, которые
// необходимо записать
&lpNumberOfBytesWrite, // адрес слова, в котором
// будет сохранено количество записанных байт
NULL); // адрес структуры типа OVERLAPPED
//******************************************************************************
printf("size file: 0x%X\npointer: 0x%X \n\n",lpNumberOfBytesWrite,Psf);
free(Psf);
size=GetFileSize(hFile, NULL);
error= GetLastError();
if(Boolean==TRUE)
printf("TRUE \nerror: %d \nsize file: %d \n\n",error,size);
else
printf("FALSE \nerror: %d \nsize file: %d \n",error,size);
CloseHandle(hFile);
system("pause>>void");
return 0;
}
Объяснение кода листинга программы
#define _CRT_SECURE_NO_WARNINGS- это директива препроцессора, которая отключает некоторые предупреждения, которые могут быть полезны при отладке кода, но могут вызывать ошибки компиляции. Эта директива позволяет компилятору игнорировать определенные предупреждения.HANDLE hFile;- это переменная типаHANDLE, которая используется для хранения дескриптора файла. Дескриптор файла - это уникальный идентификатор файла, который используется операционной системой для управления файлом.BOOL Boolean=TRUE;- это переменная типаBOOL, которая инициализируется значениемTRUE. ТипBOOLможет иметь только два значения:TRUEиFALSE.DWORD lpNumberOfBytesWrite;- это переменная типаDWORD, которая используется для хранения количества байт, которые были записаны в файл.int error, size;- это переменные типаint, которые используются для хранения ошибок и размера файла соответственно.char *Psf;- это переменная типаchar *, которая используется для хранения указателя на блок памяти, который будет использоваться для чтения и записи данных в файл.char strNameFile[128];- это переменная типаchar, которая используется для хранения строки имени файла, который будет открыт.char strPatchFile[132]={C:\};- это переменная типаchar, которая используется для хранения строки пути к файлу, который будет открыт.printf(C:\);- это функцияprintf, которая используется для вывода строкиC:\\в консоль.scanf(%132s, strNameFile);- это функцияscanf, которая используется для чтения строки имени файла из консоли.strcat(strPatchFile, strNameFile);- это функцияstrcat, которая используется для добавления строкиstrNameFileв конец строкиstrPatchFile.hFile=CreateFile(strPatchFile, GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);- это функцияCreateFile, которая используется для создания или открытия файла. В данном случае, файлstrPatchFileбудет открыт для чтения.if (hFile == INVALID_HANDLE_VALUE)- это условие, которое проверяет, является ли дескриптор файлаhFileнедействительным. Если это так, то выводится сообщение об ошибке и функцияmainвозвращает значение0.size=GetFileSize(hFile, NULL);- это функцияGetFileSize, которая используется для получения размера файла.error=GetLastError();- это функцияGetLastError, которая используется для получения последнего кода ошибки, который был установлен операционной системой.Psf=(char*)malloc(size*sizeof(char));- это функцияmalloc, которая используется для выделения памяти для блока данных. В данном случае, блок памяти будет выделен для строки, которая будет содержать содержимое файла.Boolean=ReadFile(hFile, Psf, size*sizeof(char), &lpNumberOfBytesWrite, NULL);- это функцияReadFile, которая используется для чтения данных из файла в блок памяти.CloseHandle(hFile);- это функцияCloseHandle, которая используется для закрытия файла.hFile=CreateFile(C:\text.txt, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);- это функцияCreateFile, которая используется для создания или открытия файла. В данном случае, файлC:\\text.txtбудет открыт для записи.Boolean=WriteFile(hFile, Psf, size*sizeof(char), &lpNumberOfBytesWrite, NULL);- это функцияWriteFile, которая используется для записи данных в файл из блока памяти.