Void main void ошибка

а при запуске из под ехе-файла выходит ошибка,

Вы бы хоть привели пример Screen-а — какая ошибка возникает. Потом, если этого не сделано — надо сделать обработку ошибок, чтобы программа выдавала скажем окно MessageBox с кодом ошибки, именем процедуры и строки, в которой возникла ошибка. А так разговор — гадание на кофейной гуще.

Насчет открывания файлов в режиме Shared и Exclusive. Если DBF-файл находится на компьютере пользователя и создан персонально для него — то открывать надо однозначно Exclusive. Далее, Вы упоминаете про сервер. По логике вещей вся информация совместного доступа должна быть на сервере, по крайней мере, это верно для архитектуры клиент-сервер.

А все локальные таблицы как правило (я, например, к этому привык) при КАЖДОМ запуске программы проверяются (на соответствие размера DBF-файла и количества записей, прописанного в заголовке), упаковываются и переиндексируются (если например по каким-либо причинам было аварийное завершение программы). Упаковка раз в месяц для локальных таблиц — это полная ерунда.

Добавлено через 4 минуты
Повторюсь. Если у Вас есть база на сервере — то никаких локальных таблиц совместного доступа быть не должно — они все должны быть перенесены на сервер.

Перейти к контенту

Странные дела начинаются с short getX (Vector *v, int pos) — почему, если у вас вектор double, вы возвращаете short, а не double?

Аналогично, если у вас

double sum=0;
...
return sqrtf(sum);

и функция возвращает double, зачем же вычислять sqrtf, а не sqrt?…

void main()

неверно, нужен

int main()

Непонятно также

if (N==0) ;

И что вы хотите этим сказать? Кстати, на скриншоте у вас int main() и return после if (N==0), а вот это уже проблема: раз main возвращает int, то и return должен быть со значением, return 0;, например.

Вот все, что найдено компилятором. Правильно ли ваш код работает, а не компилируется — вопрос другой, не смотрел… Но даже навскидку:

void setN (Vector *v, int nr){
    if (nr<1) v->n=1;
    else v->n=nr;
}

Как я понимаю, это изменение размера (количества элементов) в векторе? Тогда почему вы не меняете выделенную память? А то ведь запросто может быть, что вы выделили 5 элементов, а потом сделали n сотней, и здравствуй, выход за пределы массива…

gylayko

30 / 29 / 15

Регистрация: 28.09.2011

Сообщений: 449

1

05.02.2012, 12:49. Показов 9867. Ответов 29

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Вот код программы, между void и main выдает ошибку declaration syntax error, что я не так делаю? моя первая прога на с++, поэтому прошу помощи)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  #include<math.h>
  #include<stdio.h>
  #include<conio.h>
float x,y,a,b,z
 
   void main()
{
   clrscr();
   printf("Vvedite a:");
   scanf("%d";&a);
   printf("Vvedite b:");
   scanf("%d";&b);
   printf("Vvedite x:");
   scanf("%d";&x);
   y=0.02;
   z=((sin(2*x-b*b)-7*a*(y*y))/(x*x*x*x+1))-(sqrt(cos(y)-5*(exp(ln(y)*6)))/(6-cos(y));
   printf("z=%d",z);
   getch();
}

0

Эксперт С++

5054 / 3115 / 271

Регистрация: 11.11.2009

Сообщений: 7,045

05.02.2012, 12:54

2

gylayko, по стандарту функция main должа возвращать значение типа int.

0

Полярный

476 / 448 / 158

Регистрация: 11.09.2011

Сообщений: 1,156

05.02.2012, 12:56

3

Цитата
Сообщение от gylayko
Посмотреть сообщение

float x,y,a,b,z

semicolon ; забыли

silent_1991,

Цитата
Сообщение от gylayko
Посмотреть сообщение

#include<math.h>
\…

getch();

Видимо в борланде работает -> на void ему пофиг.
А так лучше конечно на int поправить

0

silent_1991

05.02.2012, 12:57

Не по теме:

Цитата
Сообщение от dimcoder
Посмотреть сообщение

semicolon ; забыли

А вот на это даже не смотрел))

0

BumerangSP

4299 / 1421 / 463

Регистрация: 16.12.2010

Сообщений: 2,939

Записей в блоге: 3

05.02.2012, 13:01

5

И на это вот:

C
1
2
3
4
5
scanf("%d";&a);
   printf("Vvedite b:");
   scanf("%d";&b);
   printf("Vvedite x:");
   scanf("%d";&x);

0

Эксперт С++

5054 / 3115 / 271

Регистрация: 11.11.2009

Сообщений: 7,045

05.02.2012, 13:03

6

dimcoder, расширение не выдаёт борланд, ибо это Pure C (правда, насколько он Pure в борланде, я не знаю). А вот clrscr(); выдаёт.

0

30 / 29 / 15

Регистрация: 28.09.2011

Сообщений: 449

05.02.2012, 13:04

 [ТС]

7

Цитата
Сообщение от silent_1991
Посмотреть сообщение

gylayko, по стандарту функция main должа возвращать значение типа int.

а у меня возвращает типа float, а что тогда нужно вместо void main() ? при замене переенных на тип int ошибка не пропадает)

0

silent_1991

Эксперт С++

5054 / 3115 / 271

Регистрация: 11.11.2009

Сообщений: 7,045

05.02.2012, 13:06

8

Цитата
Сообщение от gylayko
Посмотреть сообщение

а у меня возвращает типа float

ЩИТО?

Цитата
Сообщение от gylayko
Посмотреть сообщение

при замене переенных на тип int

А переменный тут при чём? По стандарту функция main может быть описана либо как

C
1
int main(void);

, либо как

C
1
int main(int argc, char *argv[]);

0

BumerangSP

4299 / 1421 / 463

Регистрация: 16.12.2010

Сообщений: 2,939

Записей в блоге: 3

05.02.2012, 13:09

9

Так должно работать:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  #include<math.h>
  #include<stdio.h>
  #include<conio.h>
float x,y,a,b,z;
 
   int main()
{
   printf("Vvedite a:");
   scanf("%d",&a);
   printf("Vvedite b:");
   scanf("%d",&b);
   printf("Vvedite x:");
   scanf("%d",&x);
   y=0.02;
   z=((sin(2*x-b*b)-7*a*(y*y))/(x*x*x*x+1))-(sqrt(cos(y)-5*(exp(log(y)*6)))/(6-cos(y)));
   printf("z=%d",z);
   getch();
   return 0;
}

0

gylayko

30 / 29 / 15

Регистрация: 28.09.2011

Сообщений: 449

05.02.2012, 13:12

 [ТС]

10

Цитата
Сообщение от BumerangSP
Посмотреть сообщение

Так должно работать:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  #include<math.h>
  #include<stdio.h>
  #include<conio.h>
float x,y,a,b,z;
 
   int main()
{
   printf("Vvedite a:");
   scanf("%d",&a);
   printf("Vvedite b:");
   scanf("%d",&b);
   printf("Vvedite x:");
   scanf("%d",&x);
   y=0.02;
   z=((sin(2*x-b*b)-7*a*(y*y))/(x*x*x*x+1))-(sqrt(cos(y)-5*(exp(log(y)*6)))/(6-cos(y)));
   printf("z=%d",z);
   getch();
   return 0;
}

все равно перед main та же ошибка!

0

silent_1991

Эксперт С++

5054 / 3115 / 271

Регистрация: 11.11.2009

Сообщений: 7,045

05.02.2012, 13:15

11

А вот так будет даже правильно работать. И будет выглядеть более-менее верно с точки зрения стиля.

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
#include<math.h>
#include<stdio.h>
#include<conio.h>
 
int main(void)
{
    float x, y, a, b, z;
    
    printf("Vvedite a:");
    scanf("%f", &a);
    printf("Vvedite b:");
    scanf("%f", &b);
    printf("Vvedite x:");
    scanf("%f", &x);
    
    y = 0.02;
    z = ((sin(2 * x - b * b) - 7 * a * (y * y)) / (x * x * x * x + 1)) - (sqrt(cos(y) - 5 * (exp(log(y) * 6))) / (6 - cos(y)));
    
    printf("z=%f", z);
    
    getch();
    
    return 0;
}

0

Полярный

476 / 448 / 158

Регистрация: 11.09.2011

Сообщений: 1,156

05.02.2012, 13:16

12

Цитата
Сообщение от gylayko
Посмотреть сообщение

все равно перед main та же ошибка!

Среду разработки и компилер назовите. Скомпилел на борланд 3.1 все работает.

0

BumerangSP

4299 / 1421 / 463

Регистрация: 16.12.2010

Сообщений: 2,939

Записей в блоге: 3

05.02.2012, 13:17

13

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  #include<math.h>
  #include<stdio.h>
float x,y,a,b,z;
   int main()
{
   printf("Vvedite a:");
   scanf("%f",&a);
   printf("Vvedite b:");
   scanf("%f",&b);
   printf("Vvedite x:");
   scanf("%f",&x);
   y=0.02;
   z=((sin(2*x-b*b)-7*a*(y*y))/(x*x*x*x+1))-(sqrt(cos(y)-5*(exp(log(y)*6)))/(6-cos(y)));
   printf("z=%f",z);
   return 0;
}

http://liveworkspace.org/code/… c9afa745ce
Как бы не думал, что он ошибку выдаст. Максимум предупреждение

1

gylayko

30 / 29 / 15

Регистрация: 28.09.2011

Сообщений: 449

05.02.2012, 13:25

 [ТС]

14

Цитата
Сообщение от dimcoder
Посмотреть сообщение

Среду разработки и компилер назовите. Скомпилел на борланд 3.1 все работает.

тот же борланд 3.1 только через dosbox ибо 64 бит!

Добавлено через 57 секунд

Цитата
Сообщение от BumerangSP
Посмотреть сообщение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  #include<math.h>
  #include<stdio.h>
float x,y,a,b,z;
   int main()
{
   printf("Vvedite a:");
   scanf("%f",&a);
   printf("Vvedite b:");
   scanf("%f",&b);
   printf("Vvedite x:");
   scanf("%f",&x);
   y=0.02;
   z=((sin(2*x-b*b)-7*a*(y*y))/(x*x*x*x+1))-(sqrt(cos(y)-5*(exp(log(y)*6)))/(6-cos(y)));
   printf("z=%f",z);
   return 0;
}

http://liveworkspace.org/code/… c9afa745ce
Как бы не думал, что он ошибку выдаст. Максимум предупреждение

а что за программа на фото? так ведь удобнее! без всяких досбоксов и т.д. работает?

0

4299 / 1421 / 463

Регистрация: 16.12.2010

Сообщений: 2,939

Записей в блоге: 3

05.02.2012, 13:26

15

Цитата
Сообщение от gylayko
Посмотреть сообщение

а что это за программа на фото?

Если Вы о ссылке, то это онлайн компилер. Кстати, вещь удобная)

0

30 / 29 / 15

Регистрация: 28.09.2011

Сообщений: 449

05.02.2012, 13:29

 [ТС]

16

Цитата
Сообщение от BumerangSP
Посмотреть сообщение

Если Вы о ссылке, то это онлайн компилер. Кстати, вещь удобная)

ну да, там все работает также как и у Вас! а через обычный компилятор борланд 3.1 нифига!

0

Эксперт С++

5054 / 3115 / 271

Регистрация: 11.11.2009

Сообщений: 7,045

05.02.2012, 13:32

17

Цитата
Сообщение от gylayko
Посмотреть сообщение

обычный компилятор борланд 3.1

А потому что это не обычный компилятор. Это чрезвычайно древний компилятор, ему уже 20 лет. за это время успели выпустить три стандарта и несколько правок к ним.

0

4299 / 1421 / 463

Регистрация: 16.12.2010

Сообщений: 2,939

Записей в блоге: 3

05.02.2012, 13:34

18

Цитата
Сообщение от gylayko
Посмотреть сообщение

ну да, там все работает также как и у Вас! а через обычный компилятор борланд 3.1 нифига!

Это говорит о том, что код правильный. Но в онлайн компиляторе можно только проверять на ошибки. Поэтому стоит найти лучше что-нибудь поновей борланда, типа dev-cpp. Лучше конечно сразу MVC.

0

Эксперт С++

5054 / 3115 / 271

Регистрация: 11.11.2009

Сообщений: 7,045

05.02.2012, 13:36

19

Цитата
Сообщение от BumerangSP
Посмотреть сообщение

MVC

Не очень хороший совет, у него есть некоторые проблемы со стандартом.

Цитата
Сообщение от BumerangSP
Посмотреть сообщение

dev-cpp

Не такая уж она и новая.

gylayko, советую среду, к которой можно подключить любой компилятор (на ваш выбор) и компилятор mingw, как можно новее (последняя релизная версия 4.6.2).

0

4299 / 1421 / 463

Регистрация: 16.12.2010

Сообщений: 2,939

Записей в блоге: 3

05.02.2012, 13:40

20

Цитата
Сообщение от silent_1991
Посмотреть сообщение

Не очень хороший совет, у него есть некоторые проблемы со стандартом.

По крайней мере уж с такими ошибками должен справляться

Слышал, что WxDev-cpp вроде как обновляется.

0

  • Forum
  • Beginners
  • void main problem

void main problem

i am trying to use this given tutorial and main needs to be void for future tutorials, but every time i compile it as void, it gives an error saying main must return an int. Although on the tutorial it worked.
I know math.h and string do not need to be there, but it is for future purposes.

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>
#include <math.h>
#include <string>
using namespace std;


void main()
{
    int people;
    float bill, tip, totaltip, total;

    cout << "How much is the bill? ";
    cin >> bill;
    cout <<"How many people will be splitting the bill? ";
    cin >> people;
    cout << "What is the percetage of the tip? ";
    cin >> tip;

    totaltip = bill *(tip/100.);
    total = (totaltip + bill) /people;

    cout << "The total tip at %" << tip << " is $" << totaltip << '.' << endl;
    cout << "Each person will pay $" << total << '.' << endl;
   
}

Last edited on

metulburr wrote:
main must return an int

Last edited on

though it works on other peoples tutorials?

I would probably find a different tutorial…

The standard says main must return an int, but apparently some compilers will let you get away with void. I just tested with msvc 2010, and it will compile

without warning.

yeah dude, main() most definitely returns an int. Consider this simple boilerplate code:
int main(int nArgs, char* pszArgs)

its kinda just what i was told to impliment in all my main methods and i would be safe

Topic archived. No new replies allowed.

Looks like no one’s replied in a while. To start the conversation again, simply

ask a new question.

Hey there. I’ve just started taking a object-oriented C++ course online — it’s been a few years since I’ve programmed C++, although I’ve programmed C more recently. Anyways, they expect me to use Visual Studio as my compiler, but I’m not budging — Xcode is where I like to write my code, and I don’t feel like reinstalling Parallels. The problem is, the code I’m supposed to use for one of the exercises defines main() using ‘void’ instead of ‘int’. In my experience programming C (and C++ if I’m not mistaking), this has never been a problem. However, with Xcode I’m getting an error that says, «error: ‘::main’ must return ‘int’». Can anyone toss me some insight into why I’m getting this error, and how I may be able to correct it so that the compiler accepts main() as ‘void’? I’ve checked the project settings under «GCC 4.0 — Language», but I didn’t find anything I could recognize as relevant, other than «C Language Dialect» being set to C99, and I don’t think that’s the issue.

Any help is appreciated — thanks.

MacBook,

Mac OS X (10.5.8)

Posted on Sep 5, 2010 4:21 AM

Tron55555 wrote:

So I guess there’s no easy way around that then?

The easy answer is to use int. Like a number of things in the Windows world, «void main()» is flat-out syntactically invalid. The Microsoft Foundation Class library will not compile with a standards-compliant C++ compiler — because it isn’t valid C++. Microsoft’s compilers have switches to enable standards compliance, but you should never use them. GCC has switches to enable it to compile MFC, but no one ever uses them.

Apple gets a lot of press with the iPad and iPhone, but the reality is that Macs are still a distant minority in any corporate/educational environment. University professors, including those in Computer Science, are known for living 20 years in the past.

You are going to have to do what every Mac user in a computer science class has always done, write your code on your Mac because you love the Mac, then port it to Windows or whatever else. You are going to need Parallels for this course. The end result is that your code will be better than anyone else’s in the class. You have to write code good enough to satisfy two compilers and you will be a better programmer for it.

Posted on Sep 6, 2010 6:24 AM

error with ‘void main()’ in C++ tool

error: ‘::main’ must return ‘int’

#include <iostream>

using namespace std;

int i=1;
void main()
{
    int i=i;
}

There was an error running:

error: '::main' must return 'int'

Reason: The C language standard allows the main function to be of type void. According to the C++ standard, main must be of type int.

Intelligent Recommendation

Main() error report-crazy delivery (not) return

Main’s error report-crazy delivery (not) return main() error Change the number of parameters Change parameter type But after all About the call stack Linux View Adjustment Windows View Adjustment (Com…

int main() void main()

Write a directory title here C/C++ :void main() C C++ void main int main( int argc, char *argv[], char *envp[] ) ? C/C++ :void main() void main(), , C , , void main(), int main() ? ? ? , C Primer Plus…

More Recommendation

error C4716 must return a value. Processing

problem The following error was reported, but I couldn’t find how to solve it. Record it here. error C4716: «TApamaInterface::GetEventValue»: Must return a value error C4716: «TApamaInt…

TL;DR How can I issue commands to reliably log FoxPro errors to a plain text file when running INSERTs and APPEND FROM commands through ODBC/OLE DB?

I am attempting to write some massaged data back into a FoxPro database. The actual connection to the .dbf’s are done by a service written by a colleague — I’m assuming it uses ODBC or OLE DB. I only supply the path to the DBF and the query strings to run. However I am running into some problems with FoxPro, and unfortunately all my experience lies in SQL Server and friends — not FoxPro.

My problem is that simple statements like the INSERT below work fine in Visual Fp, but fail going through the service. I don’t get much useful error information back other than «An error occured».

INSERT INTO "ADDRESSES" (addressid, firstname, lastname) ;
VALUES (55, 'Test', 'Testerson')

To make life easier for myself I have tried to issue more commands to make FoxPro log all error info to a text file. Again, this works in Visual FoxPro — but fails silently and does not output a file when run through the service. I’ve ensured the directory permissions are correct:

LOCAL lcOldOnError
lcOldOnError = ON("ERROR") && save old error handler

SET PROCEDURE TO [D:\foxpro\errhandler.prg]
ON ERROR DO ErrHandler WITH ERROR(), MESSAGE() 

&& This insert causes a duplicate primary key error: 
INSERT INTO "address book!addresses" (addressid, firstname, lastname) ;
VALUES (1, 'MyName', 'IsError')

ON ERROR &lcOldOnError && restore old error handler

The external PRG errorhandler.prg looks like this. It works inside Visual FoxPro:

PROCEDURE ErrHandler
    PARAMETERS gnError, gcMsg
    LOCAL aErrInfo[1]
    AERROR(aErrInfo)

    cErrMsg = LTRIM(STR(aErrInfo[1])) + CHR(13) + CHR(10) + aErrInfo[2] + CHR(13) + CHR(10) + aErrInfo[3] + CHR(13) + CHR(10)
    lnFileHandle = FCREATE ([D:\foxpro\errorlog.txt])
    FPUTS(lnFileHandle, cErrMsg)
    FCLOSE(lnFileHandle)
ENDPROC

Any hints or tips would be appreciated, thanks.

@DRapp, here is my C# code. It is very site specific I am afraid, so don’t know if it helps anything:

static void Main(string[] args)
{
    // Test - not production code!
    var errormessage = string.Empty;
    DataSvc dataService = new DataSvc();
    dataService.AppDataPath = @"D:\foxpro\test\DATA\addresses.dbf";

    const string commandText = "INSERT INTO [address book!addresses] (addressid, firstname, lastname) VALUES (90, [Iam], [Error])";
    var returnValue = dataService.ExecuteCommands(commandText, ref errormessage);

    Console.WriteLine("\nResult:{0}\nErrorMsg: {1}", returnValue, errormessage);
    Console.ReadLine();
}

I only get errors of the kind «An error occured» from DataSvc, so that’s why I would like to decorate the INSERT statements with some more commands for rerouting error info to a text file.

I am getting an

SQLite Error 14: ‘unable to open database file’

with EF Core code first, no idea why. I worked fine the first time, the database file got created in c:\users\username\AppData\Local\Packages\PackageId\LocalState.

Then I deleted the database file and the code first migration and ModelSnapshot classes and created a new migration (I am calling DbContext.Database.Migrate() on app start to automatically execute them). Now the database cannot be created again.

asked May 28, 2017 at 21:56

IngoB's user avatar

i think the issue is that the EntityFramework Core can’t create folders by itself while using SQLite provider. Don’t know if the issue also appears when using other filebased database providers.

i had the same issue:
my datasource was something like:
optionsBuilder.UseSqlite(@»Data Source=c:\foo_db\bar_db.db»);

after i created the «foo_db» folder inside the c:\ drive, the problem was solved and EF Core created the .db file inside the folder.

answered Jun 10, 2018 at 18:08

darkdog's user avatar

darkdogdarkdog

3,8057 gold badges37 silver badges47 bronze badges

1

Solved it.

  1. Activating «break on all exceptions» (in exceptions settings window) caused the weird ‘unable to open database file’ exception.

  2. Removing the [Table(«TableName»)] attributes on my entity classes caused some strange table creation behavior in the migration class. I thought the attribute is only needed to create a table with another name than the class name.

answered May 29, 2017 at 18:19

IngoB's user avatar

IngoBIngoB

2,5721 gold badge22 silver badges35 bronze badges

1

The Actual issue is after migration and database update *.db file doesn’t go to bin folder automatically.
You Just need to select the *.db and change properties «Copy to Output Directory» = «Copy if newer».
This will resolve the issue.. please try and let us know.

answered Nov 21, 2019 at 1:05

Deepak Shaw's user avatar

Deepak ShawDeepak Shaw

4854 silver badges6 bronze badges

0

I also solved the problem by replacing «InProcess» in the project file (*.csproj) with «OutOfProcess«. I hope it helps you too.

answered Feb 7, 2019 at 21:13

Erkan Hürnalı's user avatar

2

You can try this code inside your DbContext class :

  protected override void OnConfiguring( DbContextOptionsBuilder optionsBuilder)
    {
        var dbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "YourDbName.db");
        optionsBuilder.UseSqlite("Filename = "+dbPath);
        base.OnConfiguring(optionsBuilder);
    }

answered Jan 11, 2020 at 13:14

Amara Miloudi's user avatar

i Was in the Same Situation my problem was fix by Moving down Down like the pic :

enter image description here
firts "AllowedHosts": "*", and them

"ConnectionStrings": {
    "DefaultConnection": "DbExample"
  }

thats happend to me with the Version NetCore 2.1 i hope this can help you out :)

answered Aug 2, 2019 at 0:59

Fryann Martinez's user avatar

Still happening as of August 2019. Tried all of the above, but the fix for me after 2 good hours was this:

Add this class anywhere in the application:

internal class CurrentDirectoryHelpers
{
    internal const string AspNetCoreModuleDll = "aspnetcorev2_inprocess.dll";
    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
    private static extern IntPtr GetModuleHandle(string lpModuleName);
    [System.Runtime.InteropServices.DllImport(AspNetCoreModuleDll)]
    private static extern int http_get_application_properties(ref IISConfigurationData iiConfigData);
    [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
    private struct IISConfigurationData
    {
        public IntPtr pNativeApplication;
        [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.BStr)]
        public string pwzFullApplicationPath;
        [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.BStr)]
        public string pwzVirtualApplicationPath;
        public bool fWindowsAuthEnabled;
        public bool fBasicAuthEnabled;
        public bool fAnonymousAuthEnable;
    }
    public static void SetCurrentDirectory()
    {
        try
        {
            // Check if physical path was provided by ANCM
            var sitePhysicalPath = Environment.GetEnvironmentVariable("ASPNETCORE_IIS_PHYSICAL_PATH");
            if (string.IsNullOrEmpty(sitePhysicalPath))
            {
                // Skip if not running ANCM InProcess
                if (GetModuleHandle(AspNetCoreModuleDll) == IntPtr.Zero)
                {
                    return;
                }
                IISConfigurationData configurationData = default(IISConfigurationData);
                if (http_get_application_properties(ref configurationData) != 0)
                {
                    return;
                }
                sitePhysicalPath = configurationData.pwzFullApplicationPath;
            }
            Environment.CurrentDirectory = sitePhysicalPath;
        }
        catch
        {
            // ignore
        }
    }
}

Then, call it first thing in Program.cs, like this:

public static void Main(string[] args)
{
    CurrentDirectoryHelpers.SetCurrentDirectory();
    CreateWebHostBuilder(args).Build().Run();
}

My Setup

  • AspNet Core 2.2 Web API
  • EF Core SQLite 2.2.6
  • Connection String set to "Filename=./mydatabase.db"

Credits

I took it from this post:
https://elanderson.net/2019/02/asp-net-core-configuration-issue-with-in-process-hosting/

answered Aug 17, 2019 at 3:14

Phillippe Santana's user avatar

In my case the same error was caused by using environment variable («%APPDATA%) in path. Took me days to figure out that putting full path solves the problem.

answered Apr 25, 2022 at 10:47

Alexander's user avatar

AlexanderAlexander

3154 silver badges11 bronze badges

In my case windows 10 Ransomware Protection was preventing LINQPad.DriverProxy.LINQPad.Drivers.EFCore.exe from accessing the file. Allowing it under ransomware protection -> block history prevented this error from being raised.

answered Feb 7, 2020 at 16:51

Dean Lunz's user avatar

Dean LunzDean Lunz

9687 silver badges28 bronze badges

This will work for me:

    static SqliteConnection CreateConnection()
    {
        string dbPath = Environment.CurrentDirectory + @"\Database.sqlite";
        SqliteConnection conn = new SqliteConnection(@"Data Source = " + dbPath);
        try
        {
            conn.Open();
        }
        catch { }
        return conn;
    }

answered Mar 18, 2020 at 6:53

Walter Kohl's user avatar

When using a web server like IIS, ensure that write access to both the SQLite database file and the directory containing that file is allowed (see this question) to the user used for running the app (which e.g. for IIS could be the application pool identity).

answered May 27, 2021 at 6:05

user7217806's user avatar

user7217806user7217806

2,0142 gold badges10 silver badges12 bronze badges

Функция main() возвращает тип int. Если вы уже это знаете, то и не читайте.

Если вы присвоите функции main() тип возврата, отличный от int, то в компиляторах, предшествующих компиляторам С99, вы получите неопределенное поведение своей программы. В компиляторах С99 вы получите неспецифицированное поведение, если так говорит реализация версии, или неопределенное поведение — если она этого не делает. Доверяете ли вы своей программе в этом отношении?

Многие просто не верят мне, когда я говорю им это (точно так же, как не верил я, когда впервые узнал об этом). Частично это связано с тем, что несколько широко известных учебников по С и, по крайней мере, по одной авторитетной программе-компилятору используют void main() с тревожной регулярностью. Ниже приведена формулировка стандарта С99 (который фактически чуть более снисходителен, чем стандарт С89, который вам, возможно, более знаком):

5.1.2.2.1. Запуск программы. Функция, вызывающая запуск программы, называется main (главная). Реализация не объявляет прототип для этой функции. Он должен быть определен путем возврата целого типа int без параметров:

int main (void) {  /*  …  */  }

либо с двумя параметрами (здесь они называются argc и argv, хотя можно использовать любые имена в том порядке, как они размещены в функции, в которой объявлены):

int main (int argc, char *argv[] ) {  /*  …   */  }

либо некоторым другим определенным реализацией способом».

5.1.2.2.3. Завершение программы. Если возвращаемый главной функцией тип является типом, совместимым с int, то возврат в главную функцию эквивалентен вызову функции выхода со значением, возвращенным главной функцией в качестве ее аргумента; при достижении скобки }, которая завершает главную функцию, возвращается значение 0. Если возвращаемый тип несовместим с типом int, состояние завершения, возвращаемое в хост-среду, является неспецифицированным».

В данном контексте «неспецифицированный» означает, что стандарт не требует какого-либо специфического поведения от компилятора, который волен возвратить в хост-среду (обычно это операционная система) любое состояние, какое ему нравится, и это применяется, только если документами реализации установлено, что она поддерживает возвращаемые из main () типы, отличные от int. Если у вас пустая (void) главная функция main () и вы пишете код для ядерного реактора или военного самолета, вы, возможно, почувствуете легкую нерешительность, и я не виню вас. Кроме того, определение main () для возврата типа void (пустой) не является синтаксической ошибкой или нарушением ограничения, так что компилятор не обязательно должен выдавать какое-либо диагностическое сообщение.

Давайте посмотрим на это несколько под иным углом. Рассмотрим четвертый аргумент функции сортировки qsort. Он специфицирован как указатель на некую функцию сравнения, принимающую в качестве аргументов две константы типа const void * и возвращающую тип int. Функция qsort вызывает эту функцию сравнения и использует возвращенное ею значение для установления взаимоотношений между двумя объектами в массиве, который подлежит сортировке. Так вот, что случится, если вы напишете функцию сравнения, подобную этой?

void CompInts (const void *pl,  const void *p2)
{
    const int  *nl  = pi;
    const int  *n2  = p2;
    int diff;
    if(*nl > *n2)
        diff = 1;
    else if(*nl == *n2)
        diff = 0;
    else
        diff = -1;
}

Слов нет, верно? У функции qsort нет способа получить информацию, в которой она нуждается. Вы не можете специфицировать прототип функций сравнения — вам потребуется отбросить правила обращения к функции qsort, если вы хотите заставить эту функцию делать то, чего от нее ожидаете.

Хорошо, вернемся к функции main (). Здесь точно такая же ситуация. Вы не ответственны за определение интерфейса main(). Для этого есть вызывающая функция. Кто вызывает main()? Это не вы (хотя фактически вы можете, если захотите, вызвать main(), точно так же как вы можете при желании вызвать свою функцию сравнения из qsort). Но первичным «заказчиком» функции main() является код запуска. Как же код запуска определит, успешно ли завершилась программа, если вы не сообщите ему об этом? Этот вызов «сидит» где-то глубоко во внутренностях системы (здесь я немного упростил его):

int returnstatus;
returnstatus = main  (argc,  argv);

Если вы «опустошите» функцию main (), появится несколько интересных возможностей:

  • Программа может работать в точности так, как вы ожидаете.
  • returnstatus может попасть в ловушку и вызвать аварийный отказ программы (либо всего компьютера).
  • Код запуска может отправить поддельный код возврата операционной системе, которая затем решит перемотать назад транзакции базы данных, поскольку программа не возвратила ожидаемого значения.
  • А это хуже всего — код запуска может снаружи достигнуть вашего носа и начать извлекать из него демонов. (Демон (Demon) — процедура, запускаемая автоматически при выполнении некоторых условий и характеризуемая непредсказуемостью поведения. — Прим. науч. ред.).

Функция main () возвращает тип int. Существует только три переносимых на другие платформы значения, которые вы можете вернуть из main ():

  • 0
  • EXITSDCCESS
  • EXIT_FAILURE

Два последние определены в <stdlib.h>, и их фактические значения варьируются в зависимости от конкретной системы. (Другими словами, не следует отыскивать эти значения в библиотеке <stdlib.h> и переносить их в свою программу.)

Если вы вернули 0, код запуска сообщит операционной системе или другой хост-среде, что ваша программа выполнилась успешно, переведя 0 при необходимости в некоторое другое значение.

Количество аргументов функции main ()

Фактически функцию можно определить путем определения реализации. Следовательно, такое определение main, как

ИЛИ

int main  (int argc,  char **argv,  char **env)

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

Ниже приведены переносимые определения функции main ():

  • int main (void)
  • int main (int argc, char **argv)
  • int main (int argc, char **argv [ ] )
  • Любое определение, в точности эквивалентное любому из трех предыдущих

Таким образом, вы можете использовать различные имена переменных в качестве argc и argv, а также можете использовать FOO, если определению предшествует typedef int FOO, и т.д. Но чтобы возвращаемое значение было переносимым, из main вы должны возвращать тип int, а также задавать либо ни одного аргумента, либо два специфицированных стандартом аргумента. Если есть необходимость получить доступ к среде переносимым способом, можете, конечно, использовать функцию getenv ().

© Ричард Хэзфилд, «Искусство программирования на C», 2001 год.

Понравилась статья? Поделить с друзьями:
  • Vmware ошибка при установке windows 10
  • Vmware workstation ошибка при включении виртуальной машины
  • Vmware ошибка при запуске приложения 0xc000007b
  • Vmware ошибка видеокарты
  • Vmware базовое соединение закрыто непредвиденная ошибка при передаче