我的结构看起来像这样:
struct tlv_msg
{
uint8_t datatype; //type of data
/* data stored in a union */
union{
int32_t s32val; /* int */
int64_t s64val; /* long long */
uint32_t u32val; /* unsigned int */
uint64_t u64val; /* unsigned long long */
char* strval; /* string */
unsigned char* binval; /* any binary data */
};
uint32_t bytelen; /* no. bytes of union/data part */
};
Run Code Online (Sandbox Code Playgroud)
此结构使用联合来保存一些不同的数据类型.我有一个alloc函数,它为堆上的struct分配内存.我是否正确地认为如果我分配一个整数类型(即联合上面的前四种类型)我只需要按如下方式分配:
tlv_msg* msg = malloc(sizeof(tlv_msg));
Run Code Online (Sandbox Code Playgroud)
sizeof(tlv_msg)返回24.我假设这是足够的字节来保存union中的最大数据类型以及其他数据成员.(不知道为什么24 - 有人可以解释吗?).
但是如果要存储的数据类型是指针类型,例如char*,那么我还需要这样做:
msg->strval = (char*)malloc(sizeof(string_length+1);
Run Code Online (Sandbox Code Playgroud)
这对我来说是有意义的,这似乎有效,但只是想检查.
我无法从2个变量创建2D数组(例如,int arr[i][j]不允许),那么我将如何创建动态大小的2D数组?
数组的维度仅在我的程序中在运行时已知.该数组用于表示网格.我将如何在C中编码?
如果我想在网络上传输带符号的长整数(32位整数),我该怎么办?如果我作为签名长发送,那么在另一端我不会(可能)知道远程机器如何代表签名号码?那我该怎么办?
下面的代码显示一个以十六进制格式存储为Java字节值的数字,以及有符号和无符号表示形式.这可能不是正确的措辞.我的意思是,这些数字可以是C风格的1字节无符号字符值.如果我正在解释这些值(这里恰好是Java,但可能使用任何语言中的任何有符号类型),那么如果'number'溢出使用符号位,则数字将显示为负数.但是我可以通过ANDFF和0xFF在无符号解释中打印.
我理解AND是如何工作的,但我无法理解ANDing如何呈现为无符号.有人可以解释一下吗?
public class understand_casting {
public static String printbinary(byte val) {
int displayMask = 1 << 7;
String str = new String();
for(int bit = 1; bit <= 8; ++bit) {
str += (val & displayMask) == 0 ? '0' : '1';
val <<= 1; //shift one to left
}
return str;
}
public static void main(String[] args) {
System.out.printf("0x50=%s, as int=%d, as unsigned int=%d\n", printbinary((byte)0x50), (byte)0x50, ((byte)0x50 & 0xFF));
System.out.printf("0x88=%s, as int=%d, as unsigned int=%d\n", printbinary((byte)0x88),(byte)0x88, ((byte)0x88 & …Run Code Online (Sandbox Code Playgroud) 我正在使用Learn You a Haskell学习Haskell.在页面54是像这样的实现:
take' :: (Num i, Ord i) => i -> [a] -> [a]
take' n _
| n <= 0 = []
take' _ [] = []
take' n (x:xs) = x : take' (n-1) xs
Run Code Online (Sandbox Code Playgroud)
我理解除第一行之外的所有代码.
我理解为::这是一个类型定义吗?
(Num i,Ord i)是一个元组.元组的第一个元素必须是数字的,足够公平.必须能够订购第二个参数.参数是相同的 - 都是我.这意味着类型必须相同?
为什么不呢(Num i,Ord j)?不是第二个元组元素引用列表吗?哪个可以是任何类型?
什么=>表示?
i - > [a] - > [a]表示第一个参数是数字?第二个参数是任何类型列表,第三个参数是任何类型列表.所以这就是说第一个param数字,第二个参数是任何类型的列表,它返回任何类型的列表.嗯,这是可以理解的,我想.
我想将用户定义的函数传递给需要用户定义的匹配函数的类.在CI期间,CI会使用带有void*参数的函数指针.但必须有更好的方法......
这大致是我想要做的事情.我的一个限制是我所在的平台没有标准库.但是可以使用基本的核心语言C++ 11.
我需要做什么:
#include <iostream>
using namespace std;
// TODO - replace this C construct with C++ equivalent
//typedef bool(*match_key)(const void* key1, const void* key2);
// somehow declare this as a typedef? need a way to declare a signature in C++
typedef template<class T>
bool (*match_key)(const T& key1, const T& key2);
// *** User defined matching function
bool mymatcher(const int i, const int j) {
return i == j;
}
template<class K>
class hashmap {
public:
hashmap<K>(const K& key, …Run Code Online (Sandbox Code Playgroud) 例如,我有一个字符串的ptr并将ptr移动到字符串中的最后一个字符并使用*p--向后迭代到字符串的开头,并且我在数组开始之前迭代到位置1这样可以吗?或者我会获得访问冲突?我只是移动指针 - 不访问.它似乎在我的代码中工作,所以想知道它是不是很糟糕的做法?
这是一个带有*next-- = rem +'A'的样本行; 是一个我在质疑如果好吗???
#include <stdio.h> /* printf */
#include <string.h> /* strlen, strcpy */
#include <stdlib.h> /* malloc/free */
#include <math.h> /* pow */
/* AAAAA (or whatever length) = 0, to ZZZZZ. base 26 numbering system */
static void getNextString(const char* prev, char* next) {
int count = 0;
char tmpch = 0;
int length = strlen(prev);
int i = 0;
while((tmpch = *prev++) != 0) {
count += (tmpch - 'A') * (int)pow(26.0, …Run Code Online (Sandbox Code Playgroud) 我有一系列C函数:
const char* find_string(uint8_t id);
int32_t find_int32(uint8_t id);
uint32_t find_uint32(uint8_t id);
uint64_t find_uint64(uint8_t id);
Run Code Online (Sandbox Code Playgroud)
返回找到的项目(在链表中).对于字符串,我可以返回一个空字符串.但是对于整数值,我想指出是否找到了积分值.C语言的用法是什么?
像这样: ?
uint32_t find_uint32(uint8_t id, int* success);
Run Code Online (Sandbox Code Playgroud) 我编写了一个replacechar函数,用替换char替换源char的实例.该函数的工作原理是字符串按预期更改,但是当我尝试使用函数的返回值时,put只输出一个空行.
有人可以解释一下正在发生的事情以及我需要在replacechar中修改的内容.
#include <stdio.h> /* puts */
#include <string.h> /* strcpy */
#include <stdlib.h> /* malloc, free */
char* replacechar(char* s, char ch1, char ch2) {
while (*s) {
if (*s == ch1)
*s = ch2;
*s++;
}
return s;
}
int main()
{
char* s = malloc(8);
strcpy(s, "aarvark");
puts(replacechar(s, 'a', 'z')); /* prints blank line */
puts(s); /* prints zzrvzrk as expected */
free(s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
感谢所有的回复.
我已经改为这个(现在工作正常).
char* replacechar(char* s, char ch1, char ch2) {
char* …Run Code Online (Sandbox Code Playgroud) 我有一个
std::unordered_map< std::string, std::unordered_map<std::string, std::string> >
Run Code Online (Sandbox Code Playgroud)
我只想插入键并稍后填写值。
例如像这样:
#include <string>
#include <unordered_map>
int main() {
std::unordered_map< std::string, std::unordered_map<std::string, std::string> > mymap;
mymap.insert("TestKey");
}
Run Code Online (Sandbox Code Playgroud)
这给出了错误:
source.cpp(6): error C2664: 'void std::_Hash<std::_Umap_traits<_Kty,_Ty,std::_Uhash_compare<_Kty,_Hasher,_Keyeq>,_Alloc,false>>::insert(std::initializer_list<std::pair<const _Kty,_Ty>>)' : cannot convert argument 1 from 'const char [8]' to 'std::pair<const _Kty,_Ty> &&'
1> with
1> [
1> _Kty=std::string
1> , _Ty=std::unordered_map<std::string,std::string,std::hash<std::string>,std::equal_to<std::string>,std::allocator<std::pair<const std::string,std::string>>>
1> , _Hasher=std::hash<std::string>
1> , _Keyeq=std::equal_to<std::string>
1> , _Alloc=std::allocator<std::pair<const std::string,std::unordered_map<std::string,std::string,std::hash<std::string>,std::equal_to<std::string>,std::allocator<std::pair<const std::string,std::string>>>>>
1> ]
1> and
1> [
1> _Kty=std::string
1> , _Ty=std::unordered_map<std::string,std::string,std::hash<std::string>,std::equal_to<std::string>,std::allocator<std::pair<const std::string,std::string>>>
1> ]
1> Reason: …Run Code Online (Sandbox Code Playgroud)