我使用Visual Studio 2010 C++并且我的项目构建没有错误但是当我运行它时我得到了这个.我在Windows XP上.
'Shaders.exe': Loaded 'C:\Documents and Settings\User\My Documents\Visual Studio 2010\Projects\Shaders\Win32\Debug\Shaders.exe', Symbols loaded.
'Shaders.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', Cannot find or open the PDB file
'Shaders.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', Cannot find or open the PDB file
'Shaders.exe': Loaded 'C:\qt-everywhere-opensource-src-4.8.3\bin\QtCored4.dll', Symbols loaded.
'Shaders.exe': Loaded 'C:\WINDOWS\system32\user32.dll', Cannot find or open the PDB file
'Shaders.exe': Loaded 'C:\WINDOWS\system32\gdi32.dll', Cannot find or open the PDB file
'Shaders.exe': Loaded 'C:\WINDOWS\system32\ole32.dll', Cannot find or open the PDB file
'Shaders.exe': Loaded 'C:\WINDOWS\system32\advapi32.dll', Cannot find or open the PDB file …Run Code Online (Sandbox Code Playgroud) 我有一个文件,其中我想迭代而不处理当前行的任何类型.我正在寻找的是去确定文本文件行的最佳方法.例如,将当前行存储到变量中似乎没用,直到我到达预定行.
示例:
file.txt的
foo
fooo
fo
here
Run Code Online (Sandbox Code Playgroud)
通常,为了得到here,我会做的事情如下:
FILE* file = fopen("file.txt", "r");
if (file == NULL)
perror("Error when opening file ");
char currentLine[100];
while(fgets(currentLine, 100, file))
{
if(strstr(currentLine, "here") != NULL)
return currentLine;
}
Run Code Online (Sandbox Code Playgroud)
但是fgets必须完全阅读三行并且currentLine必须存储foo,fooo并且fo.
有没有更好的方法来做到这一点,知道here第4行?有点像go to文件?
我使用以下开关编译了我的 C++ 代码:
g++ -O0 -g -rdynamic -DNDEBUG -DARMA_NO_DEBUG -std=c++11 -pthread
Run Code Online (Sandbox Code Playgroud)
链接器开关是:
-lboost_system -lboost_thread -lboost_chrono -larmadillo -pthread
Run Code Online (Sandbox Code Playgroud)
但是我在我的应用程序中没有使用线程。我也避免使用任何delay函数。
然后我运行代码并使用perf工具对其进行测试。
sudo perf record ./bin/my_application
sudo perf report -f
Run Code Online (Sandbox Code Playgroud)
结果对我来说很奇怪:
Overhead Command Shared Object Symbol
50.92% myApplication [kernel.kallsyms] [k] native_sched_clock
24.73% myApplication [kernel.kallsyms] [k] pick_next_entity
17.46% myApplication [kernel.kallsyms] [k] prepend_name
2.57% myApplication myApplication [.] arma::arrayops::copy_small<double>
1.11% myApplication myApplication [.] arma::Mat<double>::Mat
1.11% myApplication myApplication [.] myClass::myMethod
1.11% myApplication libblas.so.3 [.] dgemv_
0.97% myApplication myApplication [.] arma::Mat<double>::init_cold
Run Code Online (Sandbox Code Playgroud)
为什么 kernel.kallsyms函数主宰了执行时间? …
我曾在一个学校项目上被要求显示我用来实现该项目的UML图(如果有的话)。但是我正在从事的项目是用C语言编写的,并且已进行了功能编程。因此,我想证明在不使用面向对象语言时使用类图是没有意义的,但是我担心这不是真的,并且无法证实这一假设。对我来说似乎毫无意义,但我想知道是否确实如此,因为可能以OOP方式思考代码可以帮助理解其工作方式。
使用类图来思考和构建功能程序的方式有什么好处?
我是 C 编程新手,我正在尝试创建一个像 Perl 编程一样的键值结构。我看到了一种解决方案,例如:-
struct key_value
{
int key;
char* value;
};
struct key_value kv;
kv.key = 1;
kv.value = "foo";
Run Code Online (Sandbox Code Playgroud)
但我不知道如何从这个结构中访问这些值。有人可以阐明这一点吗?
我有众所周知的错误:
implicit declaration of function 'STLINKReadSytemCalls' [-Wimplicit-function-declaration]
implicit declaration of function 'printf' [-Wimplicit-function-declaration]
incompatible implicit declaration of built-in function 'printf'
Eclipse(更准确地说是 Atollic TrueStudio)友好地补充道:
include '<stdio.h>' or provide a declaration of 'printf'
阅读了数十亿篇关于如何解决这个问题的帖子,似乎三个问题可能会导致这些错误:
#ifndef,#define并且#endif没有正确包装头文件我发现一个帖子,其中有人似乎有这个错误,并在修复它后说 Eclipse 是问题所在。虽然找不到主题,但他的解决方案对我不起作用。这就像单击函数,source -> addincludes。
主程序
int main(void) {
if (STLINKReadSytemCalls() == 1)
printf("Error in system calls.\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
文件处理.c
#include "../header/fileProcessing.h"
int STLINKReadSytemCalls(void) {
// mainly system calls
}
Run Code Online (Sandbox Code Playgroud)
文件处理.h
#ifndef FILEPROCESSING_H_
#define FILEPROCESSING_H_
#include <stdlib.h> …Run Code Online (Sandbox Code Playgroud) 我A在main.c文件中定义了函数.我创建了三个使用该函数A而不导入任何内容的库.代码有效,但我只有一个警告:implicit declaration of function 'A' [-Wimplicit-function-declaration].
该函数如何在单独的文件中定义的函数中A工作B而不导入它?当A除了函数之外的其他函数调用函数时,我怎么可能只有一个警告B?
这是一个非常简单的问题,我很惊讶我在SO上没有找到任何其他地方.我想知道哪些评论应该或不应该在标题/源文件中.如果在标题和源上都声明,那将是redondant或required.到目前为止,我一直这样做:
main.c或main.cpp
int main()
{
// Comments to describe what happens in main
}
Run Code Online (Sandbox Code Playgroud)
foo.h中
// Comments for documentation and which gives information about the function itself
/**
* \fn void aFunction(void)
* \brief This function is a function
*/
void aFunction(void);
Run Code Online (Sandbox Code Playgroud)
foo.c或foo.cpp
void aFunction(void)
{
// Comments to describe and explain what happens within this function
}
Run Code Online (Sandbox Code Playgroud)
这就是我所知道的.主,源或标题中是否需要更多注释?我是否应该添加我通常只在源代码中添加标题的注释,如下所示:
foo.c或foo.cpp
/**
* \fn void aFunction(void)
* \brief This …Run Code Online (Sandbox Code Playgroud) #include <stdio.h>
int main(void)
{
unsigned int var=1;
var = var<<32;
printf("%u ",var);
}
Run Code Online (Sandbox Code Playgroud)
此代码1作为其输出产生.如果我写 var = var<<31;它的收益率2147483648.
如果我输入var = 12;然后var = var<<32;它产生12.我从我的教科书(旧版本)中读到,ANSI C不允许在单个操作中将所有位移出一个值.
所有主要的编译器都表现相同(复制粘贴输入到输出)或只是GCC确实将粘贴12从输入复制到输出当我指示它做var = var<<32;?
main()
{
int i=0,j=0;
while(i<5,j<10)
{
i++;
j++;
}
printf("%d,%d,",i,j);
}
Run Code Online (Sandbox Code Playgroud)
输出: 10,10
int main(){
int x=2,y=2;
while(x<=5,y<=3)
printf("%d %d ",++x, ++y);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出: 3 3 4 4
在第一个代码中,输出如何产生10,10?任何人都可以解释,但第二个代码的输出是3344,是否都运行在不同的逻辑上?
我试图在STM32L4芯片的内存闪存中写入数据.这是在编程上下文中完成的,其中我使用C调用ST-Link实用程序命令行.
这是一个闪存的例子:
0 4 8 C
0x1FFF7000 FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经能够在64位数据空间上只写32 位:
0 4 8 C
0x1FFF7000 AAAAAAAF FFFFFFFF BBBCCCDD FFFFFFFF
Run Code Online (Sandbox Code Playgroud)
在前32位写入时,第二个32位被锁定.因此,如果内存处于先前状态,则不允许以下写入:
0 4 8 C
0x1FFF7000 AAAAAAAF 00000001 BBBCCCDD FFFFFFFF
^^ ^^
Not allowed Locked
Run Code Online (Sandbox Code Playgroud)
我只能在64位数据空间中写入大小受32位限制的数据.我发现这非常奇怪,因为没有理由以这种方式处理内存.
编辑:这是真的,因为我想在OTP中写,当我在别处写的时候,它似乎正常工作
第一种可能的方案
我对上一个问题的回答引用了这个:
级别2:无调试
在此级别中,保证级别1得到保证.此外,Cortex®-M4调试端口,从RAM启动(启动RAM模式)和从系统存储器启动(启动加载器模式)不再可用.在用户执行模式(引导闪存模式)下,Flash主存储器上允许所有操作....... 根本无法删除
2级:这是不可逆转的操作.
有没有办法让启用级别2允许我在64位内存空间上写两次32位?
第二种可行方案
查看芯片的文档,我找到了闪存编程序列(第102页):
- 通过检查闪存状态寄存器(FLASH_SR)中的BSY位,检查没有闪存主存储器操作正在进行.
- 由于之前的编程,检查并清除所有错误编程标志.如果没有,则设置PGSERR.
- 将Flash控制寄存器(FLASH_CR)中的PG位置1.
- 在所需的存储器地址,主存储器块或OTP区域内执行数据写操作.只能编程双字. - 在与双字对齐的地址中写入第一个字 - 写第二个字
- 等到FLASH_SR寄存器中的BSY位清零.
- 检查FLASH_SR寄存器中是否设置了EOP标志(表示编程操作已成功),并通过软件将其清除.
- 如果不再有编程请求,则清零FLASH_SR寄存器中的PG位.
我一直无法理解第3步中的PG位是什么.但是当我尝试设置它时,不允许写入. …
在C(不是C++)中,我们可以考虑几种处理字符串长度的方法:
只需依赖null终止符(\0):我们假设该字符串不包含\0.将字符串存储到char数组并\0在末尾追加.使用strlen()我们需要它的大小时的功能.
将字符和长度存储到struct:
typedef struct _String {
char* data;
int size;
} String;
使用另一个变量来存储长度:例如,
char name[] = "hello";
int name_size = 5;
some_func(name, name_size, ...);
就个人而言,我更喜欢使用第二种方法
它可以覆盖一些包含\0在中间的"怪异"字符串.
我们可以实现一些功能,如string_new(),string_del(),string_getitem(),等写一些"OOP般"的代码.
我们没有两个(或更多)变量来处理字符串及其长度.
我的问题是:在C中处理字符串最常用的方法是什么?(特别是:当我们必须使用很多字符串时(例如编写一个解释器))
谢谢.
c ×8
c++ ×3
eclipse ×2
bit-shift ×1
comments ×1
deprecated ×1
embedded ×1
fgets ×1
file ×1
flash-memory ×1
header-files ×1
include-path ×1
io ×1
java ×1
linux-kernel ×1
loops ×1
pdb-files ×1
perf ×1
stm32 ×1
string ×1
struct ×1
swing ×1
uml ×1
while-loop ×1