如果这是一个糟糕的问题,请原谅。最有可能的是。但我认为(long int)[some string]
应该将字符串转换为long int。这似乎并非如此,因为我刚刚编写了一个示例程序。
#include <iostream>
#include <cstdlib>
using namespace std;
int main(int argc, char **argv)
{
int firstNum = atoll(argv[1]);
int secondNum = atoll(argv[2]);
int sum = firstNum + secondNum;
long int firstArg = (long int)argv[1];
long int secondArg = (long int)argv[2];
long int argSum = firstArg + secondArg;
cout << "The argSum is: " << argSum << ", which is same as sum: " << sum << endl;
}
由于我正在阅读的代码,我得到了这种印象。解释会帮助我建立一些知识。感谢。
srv.request.a = atoll(argv[1]);
srv.request.b = atoll(argv[2]);
if (client.call(srv))
{
ROS_INFO("Sum: %ld", (long int)srv.response.sum);
}
答案 0 :(得分:2)
int main(void)
{
/* STM32L0xx HAL library initialization */
HAL_Init();
/* Configure the system clock to 2 MHz */
SystemClock_Config();
/* System Power Configuration */
SystemPower_Config() ;
/* Check if the system was resumed from Standby mode */
if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
{
/* Clear Standby flag */
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
}
/* Insert 5 seconds delay */
HAL_Delay(5000);
/* The Following Wakeup sequence is highly recommended prior to each Standby mode entry
mainly when using more than one wakeup source this is to not miss any wakeup event.
- Disable all used wakeup sources,
- Clear all related wakeup flags,
- Re-enable all used wakeup sources,
- Enter the Standby mode.
*/
/* Disable all used wakeup sources: PWR_WAKEUP_PIN3 */
HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN3);
/* Clear all related wakeup flags*/
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
/* Enable WakeUp Pin PWR_WAKEUP_PIN3 connected to PA.02 (Arduino A7) */
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN3);
/* Enter the Standby mode */
HAL_PWR_EnterSTANDBYMode();
/* This code will never be reached! */
while (1)
{
}
}
/**
* @brief System Clock Configuration
* The system Clock is configured as follow :
* System Clock source = MSI
* SYSCLK(Hz) = 2000000
* HCLK(Hz) = 2000000
* AHB Prescaler = 1
* APB1 Prescaler = 1
* APB2 Prescaler = 1
* Flash Latency(WS) = 0
* Main regulator output voltage = Scale3 mode
* @retval None
*/
void SystemClock_Config(void)
{
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
/* Enable MSI Oscillator */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
RCC_OscInitStruct.MSIState = RCC_MSI_ON;
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_5;
RCC_OscInitStruct.MSICalibrationValue=0x00;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK)
{
/* Initialization Error */
while(1);
}
/* Select MSI as system clock source and configure the HCLK, PCLK1 and PCLK2
clocks dividers */
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0)!= HAL_OK)
{
/* Initialization Error */
while(1);
}
/* Enable Power Control clock */
__HAL_RCC_PWR_CLK_ENABLE();
/* The voltage scaling allows optimizing the power consumption when the device is
clocked below the maximum system frequency, to update the voltage scaling value
regarding system frequency refer to product datasheet. */
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
/* Disable Power Control clock */
__HAL_RCC_PWR_CLK_DISABLE();
}
/**
* @brief System Power Configuration
* The system Power is configured as follow :
* + VREFINT OFF, with fast wakeup enabled
* + No IWDG
* + Wakeup using PWR_WAKEUP_PIN3
* @param None
* @retval None
*/
static void SystemPower_Config(void)
{
/* Enable Power Control clock */
__HAL_RCC_PWR_CLK_ENABLE();
/* Enable Ultra low power mode */
HAL_PWREx_EnableUltraLowPower();
/* Enable the fast wake up from Ultra low power mode */
HAL_PWREx_EnableFastWakeUp();
}
/**
* @brief Enters Standby mode.
* @note In Standby mode, all I/O pins are high impedance except for:
* - Reset pad (still available)
* - RTC_AF1 pin (PC13) if configured for tamper, time-stamp, RTC
* Alarm out, or RTC clock calibration out.
* - RTC_AF2 pin (PC13) if configured for tamper.
* - WKUP pin 1 (PA00) if enabled.
* - WKUP pin 2 (PC13) if enabled.
* - WKUP pin 3 (PE06) if enabled, for stm32l07xxx and stm32l08xxx devices only.
* - WKUP pin 3 (PA02) if enabled, for stm32l031xx devices only.
* @retval None
*/
void HAL_PWR_EnterSTANDBYMode(void)
{
/* Select Standby mode */
SET_BIT(PWR->CR, PWR_CR_PDDS);
/* Set SLEEPDEEP bit of Cortex System Control Register */
SET_BIT(SCB->SCR, SCB_SCR_SLEEPDEEP_Msk);
/* This option is used to ensure that store operations are completed */
#if defined ( __CC_ARM)
__force_stores();
#endif
/* Request Wait For Interrupt */
__WFI();
}
是一个函数,它解析一个字符串以产生它表示为atoll
的数值(然后你将其填入long long
)。
Casting ,这是int
正在做的事情,它告诉编译器将一个值解释为另一种类型。在你的情况下,你试图解释的是指向一个字符的指针,而不是由它指向开头的字符串表示的值。
答案 1 :(得分:1)
但我的印象是(long int)[some string]应该将字符串转换为long int。
这是不正确的。
它的作用是获取表示字符串的指针值并将其转换为long int
。没有人知道从一次运行到下一次运行会有什么价值。
另一方面,使用atoll(argv[1])
可以正确地从字符串中提取数字。
答案 2 :(得分:0)
(long int)[some string]是一个强制转换,它没有对数据进行实际处理,它只是告诉编译器解释任何数据[某些字符串]就好像它是一个long int,在这种情况下你是& #39;将看到内存中字符串的偏移量,因为C字符串只是指向某些数据的指针。
atoll是一个解析字符串并将文本转换为整数值的函数。
答案 3 :(得分:0)
我的印象是(long int)[some string]应该将字符串转换为long int。
你误会了。 显式转换(又名 cast )不会做任何类似的事情。将“char
”指针(这是您的字符串的类型)转换为整数时,将导致指针指向的地址的整数值 - 如果目标整数类型无法表示,则可能会丢失精度内存地址值。
环礁和(长int)之间的区别?
atoll
根据字符串内容所代表的数字将字符串转换为整数值。
显式转换具有不同的行为,具体取决于参数的类型,但在字符指针的情况下,请参阅上面的段落。